Conversation
Adopts the Open Knowledge Format v0.2 as the home for Lotti's architecture documentation, at knowledge/. Documentation is now split by audience: lib/features/*/README.md describes what a feature does for a user, knowledge/ describes how it actually runs. No fact is written twice. The validator in tool/okf/ enforces OKF conformance and, more importantly, that every code path a concept points at still exists. A rename that invalidates the docs fails CI, so the person holding the context is the one who fixes the prose. This commit lands the infrastructure and the cross-cutting architecture layer: bootstrap and DI, persistence, navigation, security and privacy, logging, and platform/release. Feature migration follows. Refs lotti3-arp
Splits the 1215-line sync README into seven grounded concepts under knowledge/features/sync/ and leaves a 66-line product description behind. Verified every structural claim against the code while migrating, which surfaced two stale spots: SyncMessage now has twenty families (the README omitted consumptionEvent) and SyncSequencePayloadType has seven members, not six. Also moves current_architecture.md out of lib/ into docs/architecture/, since an investigation log is not product documentation. Refs lotti3-arp.4
Splits the 2350-line agents README into eight grounded concepts under knowledge/features/agents/ and leaves a 71-line product description behind. Also teaches the validator to skip fenced blocks and inline code when scanning links, so a documented link form quoted in prose is no longer reported as a dangling bundle link. Refs lotti3-arp.4
Splits the 1345-line ai README into ten grounded concepts under knowledge/features/ai/ and leaves a 67-line product description behind. The anti-drift check earned its keep here: it caught profile_locality.dart documented under util/ when it actually lives in helpers/. The README also claimed nine built-in skills where there are ten. Refs lotti3-arp.4
Splits the 1756-line daily_os_next README into nine grounded concepts under knowledge/features/daily_os_next/ and leaves a 68-line product description. The anti-drift check again caught stale paths the README carried: the prompt sections and prompt builder had both moved out of agents/domain/. Completes wave 1 (sync, agents, ai, daily_os_next): 6666 README lines migrated into 42 concepts. Refs lotti3-arp.4
Splits the 1386-line tasks README into six grounded concepts under knowledge/features/tasks/ and leaves a 57-line product description. Refs lotti3-arp.5
Splits the 603-line journal README into three grounded concepts and leaves a 65-line product description. Refs lotti3-arp.5
Splits the 616-line design_system README into two grounded concepts and leaves a 60-line product description. Refs lotti3-arp.5
Refs lotti3-arp.5
JournalEntity and its Metadata envelope, the entry-link union, and the entity definitions — including why the category automatic-inference flag is a consent gate rather than a preference. Refs lotti3-arp.3
Refs lotti3-arp.6
Refs lotti3-arp.6
Refs lotti3-arp.6
Refs lotti3-arp.6
…wledge bundle Refs lotti3-arp.6
settings_v2, whats_new, tts, keyboard, checklist, theming, notifications, user_activity. Refs lotti3-arp.6
… and the projection kernel Refs lotti3-arp.7
Refs lotti3-arp.8
Migrates the last seven READMEs — shared widgets, services, AI settings UI, selection, modal, recording UI and celebration — and adds the corresponding concepts. All 40 READMEs under lib/ are now product descriptions: 19,269 lines became 1,654, with the architecture they carried living in 88 concepts under knowledge/. Refs lotti3-arp.7
The rebase replaced four READMEs main had just edited, so the facts those edits added move into the concepts rather than being lost: - agents: the footer regrouped around two questions, Skip once, the dense trigger and accent discipline, the button content-inset translation, and inferenceRouteIdentityTiers shedding route segments instead of ellipsising. - agents/categories/domain: automaticAgentWakesEnabled seeds a task agent's automatic updates, is mirrored into the orchestrator, and is a seed rather than a gate. - design system: the DesignSystemButton size ramp and what dense is for. - daily_os_next: the past-start guard now covers every block type, cal blocks are refused on both routes and absent from both tool schemas, and taskId is resolved against the journal on both routes. Two concepts described the old cal exemption and were wrong.
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
|
Important Review skippedToo many files! This PR contains 178 files, which is 28 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (178)
You can disable this status message by setting the ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3600 +/- ##
=======================================
Coverage 99.15% 99.15%
=======================================
Files 1784 1784
Lines 131122 131122
=======================================
+ Hits 130009 130010 +1
+ Misses 1113 1112 -1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 46d0768959
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Six review findings, all real: - Require stale_after and sources as house keys. Both were only validated when present, so a new concept could omit exactly the metadata that makes drift detectable. - Guard the root index.md loadYaml. Invalid YAML there threw past the issue list and took the CLI down with a stack trace instead of reporting a file-scoped diagnostic. - Scan reference-style link definitions. `[impl]: ../../lib/gone.dart` matched no pattern, so a dangling code pointer passed make okf_check. Footnote definitions stay excluded — §5.1 keys those to sources[].id and their body is prose. - Validate real calendar dates and times. DateTime rolls out-of-range components over rather than rejecting them (2026-99-99 parses as 2034-06-07, 99:99:99 as an instant four days later), so shape-only regexes accepted impossible metadata. Range-check first, then round-trip for day-of-month. - Repoint the three remaining references to the moved sync document. - Add the AI-config lifecycle diagram. That concept documents deleteConfig, hardDeleteConfig and restoreConfig as distinct transitions, and AGENTS.md — added in this PR — requires a diagram for a real state machine. The test fixtures now build from one house-key block, so a future required key is a single edit rather than thirty. Verified the new reference-link and date tests fail with their fix removed.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e71e359123
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ance Four further findings, all real: - `sources[].resource` must be a non-empty *string*. `resource: 123` passed the presence check and was then skipped by _resourceTargets, which only yields strings — so a present entry could carry no usable attribution while make okf_check succeeded. - A root index.md carrying a frontmatter mapping without `okf_version` emitted nothing, because the fallback warning only fires when the whole block is absent. - Seven workflows listen on tag pushes, not six. The prose and the frontmatter description disagreed with the diagram directly below them, which already listed all seven. - Refresh provenance dates for the files this branch itself modifies — AGENTS.md and the Makefile. A bundle whose selling point is honest provenance should not ship with dates its own commit invalidated. The moved sync document keeps 2026-05-30: the rename changed its path and not one byte of its content, so that remains its accurate content recency. Both new guards are covered by tests verified to fail with the guard removed.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ba6ff3c037
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…or gaps Three of these were assertions in the bundle that the code contradicts, which is the failure mode this bundle exists to prevent: - user_activity: I listed Daily OS as an activity-gate consumer. UserActivityGate has zero references in daily_os_next — DayProcessingRuntime drains on startup, outbox changes, retries and connectivity without waiting for idle. I inferred that consumer from the sync pattern rather than checking. Now stated as the real difference it is. - onboarding: "skipping persists nothing" is wrong. The modal records welcomeSkipped, and the auto-show path writes the shown count and first-shown timestamp before opening. What a skip preserves is the grace period, not storage neutrality. - celebration/checklists: "haptics always fire" is wrong as an absolute. The animation switches and reduce-motion do not silence haptics, but a separate haptics preference does, honoured via onCelebrate: null. Plus a CI map that mis-described its own triggers (type-check has no path filter; flatpak-foreign-deps filters PRs but not branch pushes), and a celebration concept that repeated its README verbatim — the duplication the split exists to prevent. Verbatim sentence overlap between the two is now zero. Validator gaps closed: - `sources: null` and `sources: []` both satisfied their checks while leaving a concept with no provenance. - A bundle-absolute `sources[].resource` (`/domain/x.md`, legal per §6.2) was checked by nothing: validateRepoReferences skips `/` prefixes and the body-link scanner never sees frontmatter. - Angle-bracket destinations `[t](<path with space>)` never matched the whitespace-free pattern, so a dangling pointer written that way passed. - log.md heading validation now strips fences, as the link scanner already did, so a `## example` inside a fenced sample is not read as a heading. 51 tests. All five new ones verified to fail with their guard removed — two of my first revert attempts silently failed to apply, so those checks were redone rather than trusted.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7ac56b0be2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The most important one is security-relevant. I wrote that API keys never touch SQLite. AiConfigDb.saveConfig() persists a provider as jsonEncode(config.toJson()) and that map includes its apiKey, so provider keys live in ai_config.sqlite — which the same concept correctly calls unencrypted at rest. A reader would have derived the opposite threat model. Now stated as the asymmetry it is: Matrix credentials are in the keychain, AI-provider keys are not, and moving them there is hardening rather than a docs fix. Four more claims the code contradicts: - persistence: "every byte lives in SQLite" is wrong — audio and images are separate files read via getAudioPath/getFullImagePath, which my own speech concept already described. Backup and migration have to cover both. - daily_os_next: StandaloneTag does not exist anywhere in lib. Task-linked is the marked case; standalone is the unmarked default. I copied this from the old README instead of checking. - overview: twelve supported locales, not seven. - shared-widgets: ModalUtils is not the only presentation path — the Daily OS planning modal and What's New call WoltModalSheet directly, the former because it needs a side panel rather than a dialog. Also, per this PR's own README contract, the agents and sync READMEs now end at their knowledge concept rather than at a supplemental reference; swept all 40 to confirm. And the localization concept named five ARB catalogs as if they were all twelve — it now states the full set and flags that AGENTS.md's required-edit list is a subset. Validator gaps closed: reference definitions accept angle-bracketed destinations containing whitespace, and a spaced source is only exempted as a §5.1 scope descriptor when it is not path-shaped — so `../../lib/missing file.dart` is checked rather than waved through. 53 tests; both new ones verified to fail with their guard removed.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 34f5a77157
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Found in a self-audit of the 'only'/'never' claims, not by review: 'installModel is the only path that downloads from Hugging Face' reads as global, but the TTS feature fetches its own Supertonic model over a separate path. Anyone auditing what reaches Hugging Face would have been misled.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6198249be8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Review round 5 on the OKF bundle. Validator — each gap now has a test that fails with the guard reverted: * Required house keys were checked for presence only, so `generated:` with nothing after the colon passed while carrying no provenance at all; every per-field validator treats YAML null like an absent key and stays silent. Empty values and non-string title/description are now reported. * A relative `./missing.dart` source was checked by neither pass: the bundle pass looked only at `/`-prefixed resources, the repo pass only at targets escaping the bundle. Every path-shaped resource now goes through the bundle pass, which already defers escaping ones. * A bare `missing.dart` was classified as a §5.1 scope descriptor and exempted from resolution; a filename-with-extension shape now counts as a path, with an extension bound so prose ending in a period stays exempt. * Link titles in the single-quoted and parenthesised forms made the whole link match nothing, hiding the target inside it. * log.md was the only .md file whose bundle-internal links nothing validated, though it is the file that links concepts most densely. * `computation: false` satisfied §10.3's file form and suppressed the warning while pointing at nothing followable. * An absolute bundle argument resolved every code pointer outside the checkout, so a clean bundle reported hundreds of drift errors purely from how it was invoked. Normalisation is now a pure, tested function. * Four-space indented code blocks were scanned for links, so a documented link form inside one failed the check — the one failure mode worse than a miss, because it blocks a correct change. Reverting each guard also exposed that index.md link validation had no test at all; added. Concepts — six claims the code contradicts: * Onboarding is not the only writer of `automaticInferenceEnabled`; the category settings form owns it from then on, via a conditionally rendered switch. The same wrong exclusivity appeared in three concepts. * Logging has no Insights sink and no in-app viewer — files are the only sink and `InsightType` is vestigial. * Theme sync is arrival-based, not last-write-wins: the local setters never advance `THEME_PREFS_UPDATED_AT`. `dailyOsUserName` does advance its timestamp, so the two are not the mirror the code comment claims. * Survey charts write too, through `PersistenceLogic.createSurveyEntry`; and the matrix has five variants, not the six I listed — there is no story-time chart. * TTS synthesis is local, but the weights are not bundled: first speak downloads six files from Hugging Face. * The repaint-rainbow maintenance row hardcodes English, contradicting the localization boundary the same concept asserts. Documented as the unfixed oversight it is rather than changing 11 locales' UI in a docs PR. Adds a stateDiagram-v2 for the notification mark lifecycle, which the repo's own rule requires for a real state machine.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 620c8d5ef8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…t claims Review round 6 on the OKF bundle. Validator: a concept whose `sources` all point inside the bundle passed both passes — the bundle check resolved the sibling file, the repo check skipped it for staying inside `knowledge/`. That is the one shape whose drift is undetectable, since a pointer at a sibling concept can never fail when the code moves, so it defeats the reason `sources` is required at all. Now warns when *nothing* in `sources` leaves the bundle. Deliberately permissive about what counts: a repo path, an external URL and a §5.1 scope descriptor all qualify. Concepts: * Matrix access tokens do touch SQLite. `SecureStorage` holds only the config JSON needed to log in; `MatrixSdkDatabase.insertClient`/`updateClient` put `token`, `refreshToken` and `olmAccount` into the unencrypted `matrix/lotti_sync.db`. The keychain holds what is needed to log in, that file holds what is needed to stay logged in — an attacker with file access needs no password. Verified against matrix-8.1.0 rather than assumed. * The security concept still said logs are "readable only in-app", contradicting the logging concept corrected in the previous commit. Restated as the tradeoff it actually is: no screen can leak log content, and no screen can show it either, so helping with a bug means exporting files. * The architecture index said six release pipelines where the release concept says seven; seven workflows listen on tag pushes. * `JournalEntity` is not every piece of user data — what the user *configures* is `EntityDefinition`, syncing as its own message family, and settings and agent state sit outside both. Coverage that walks only `JournalEntity` is incomplete by construction, which is the kind of thing backup and migration work reads this concept to decide. * The activity gate does not make the start race-free. `waitUntilIdle()` awaits one idle edge and takes no lease, registers no cancellation hook and excludes nothing afterwards, so a user resuming just after the edge gets their input during a large apply exactly as before. The concept now bounds the promise at "delays work to an idle edge, and nothing more".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 62f94da8b3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| return [ | ||
| OkfIssue( | ||
| severity: Severity.warning, |
There was a problem hiding this comment.
Fail validation when sources never cite code
Fresh evidence in the follow-up implementation is that a concept sourced only from an existing sibling concept now produces Severity.warning, while validate.dart exits nonzero for warnings only with --warnings-as-errors; neither make okf_check nor the workflow supplies that flag. Such a concept therefore still passes CI without any source pointing at the code it was derived from, so this repository-specific provenance violation needs to be an error.
AGENTS.md reference: AGENTS.md:L120-L123
Useful? React with 👍 / 👎.
| } | ||
|
|
||
| final _fencedBlockPattern = RegExp( | ||
| r'^(```|~~~).*?^\1', |
There was a problem hiding this comment.
Ignore fences indented by up to three spaces
When a concept contains a valid Markdown fence indented by one to three spaces, this start-anchored pattern does not remove it; _stripIndentedBlocks also ignores indentation below four spaces. A sample link such as [implementation](../../lib/missing.dart) inside that code block is consequently scanned as a live repository pointer and makes make okf_check fail even though Markdown renders no link.
AGENTS.md reference: AGENTS.md:L130-L131
Useful? React with 👍 / 👎.
| multiLine: true, | ||
| dotAll: true, | ||
| ); | ||
| final _inlineCodePattern = RegExp(r'`[^`\n]*`'); |
There was a problem hiding this comment.
Ignore multi-backtick code spans
When documentation uses a valid multi-backtick code span such as ``[implementation](../../lib/missing.dart)``, this single-backtick regex removes only the adjacent delimiter pairs and leaves the link text exposed. The repository-reference pass then reports the example as a dangling live pointer and blocks an otherwise valid knowledge change.
AGENTS.md reference: AGENTS.md:L130-L131
Useful? React with 👍 / 👎.
| // 'source')` matching nothing at all, so the dangling pointer inside it was | ||
| // never even offered for checking. | ||
| final _markdownLinkPattern = RegExp( | ||
| r'\[[^\]]*\]\(\s*(?:<([^>]*)>|([^)\s]+))' |
There was a problem hiding this comment.
Parse balanced parentheses in link destinations
When a valid bare Markdown destination contains balanced parentheses—for example [impl](../../lib/foo_(bar).dart)—the [^)\s]+ group stops at the inner ), so the validator checks the truncated path ../../lib/foo_(bar. Even if the real file exists, make okf_check reports it as missing; destination parsing needs to preserve balanced parentheses or use a Markdown parser.
AGENTS.md reference: AGENTS.md:L130-L131
Useful? React with 👍 / 👎.
| required String workingDirectory, | ||
| }) { | ||
| final normalized = bundleRoot.replaceAll(r'\', '/'); | ||
| if (!normalized.startsWith('/')) return normalized; |
There was a problem hiding this comment.
Canonicalize relative bundle-root aliases
When the documented positional argument is a relative alias containing .., such as running from the repository root with ../lotti/knowledge, returning it unchanged makes a normal source resolve to ../lotti/lib/...; validateRepoReferences interprets that prefix as escaping the repository and emits an error for every code pointer. Normalize relative roots against the working directory just like absolute roots, or reject aliases that cannot establish the repository boundary.
AGENTS.md reference: AGENTS.md:L130-L132
Useful? React with 👍 / 👎.
| **`sync` is the one domain that routes to its own file.** It is off by default | ||
| and far noisier than everything else — a catch-up can produce thousands of lines | ||
| in a second — so it goes to `sync-<date>.log` where it can be read in isolation | ||
| without burying the rest. |
There was a problem hiding this comment.
Document the per-domain logging sinks
For every enabled non-sync DomainLogger.log call, production first invokes LoggingService.captureEvent for the general daily log and then synchronously appends a second <domain>-YYYY-MM-DD.log; errors additionally write error-safe and per-domain files. The claim that only sync routes to its own file gives diagnostics and privacy audits an incomplete file inventory, so describe the fan-out rather than the legacy single-route model.
AGENTS.md reference: AGENTS.md:L111-L114
Useful? React with 👍 / 👎.
| `ProfileAutomationService` consults it before **every** automatic path — the | ||
| profile-driven one and the direct transcription fallback alike — so this flag, not | ||
| the profile, is the switch that decides whether automation runs. See |
There was a problem hiding this comment.
Account for synced audio in the consent boundary
When audio recorded on another device syncs to a task with a pinned local profile and an automated transcription assignment, SyncedAudioInferenceDispatcher invokes SkillInferenceRunner directly without loading the category or checking automaticInferenceEnabled; it explicitly bypasses ProfileAutomationService. The category flag therefore does not currently guard every automatic path as claimed, so either add that gate to the synced-audio dispatcher or qualify this consent invariant in all affected concepts.
AGENTS.md reference: AGENTS.md:L111-L114
Useful? React with 👍 / 👎.
| **The visible experience is gated by `enableProjectsFlag`.** With it off there is | ||
| no top-level tab, no category projects section and no task project chip. Routes | ||
| may still exist, but the normal ways in are hidden. |
There was a problem hiding this comment.
Keep the task project picker inside the feature gate
When enableProjectsFlag is off, a categorized task opened in the desktop detail pane still renders its project crumb, watches projectForTaskProvider, and receives an onProjectTap callback that opens ProjectSelectionModalContent; the connector never reads the flag. This remains a normal project entry and write path despite the concept claiming the task project control is hidden, so either gate the header control or qualify the feature-flag boundary.
AGENTS.md reference: AGENTS.md:L111-L114
Useful? React with 👍 / 👎.
| `pause()` and `resume()` exist on the controller but are **not surfaced by the | ||
| current modal UI**. |
There was a problem hiding this comment.
Describe the recording modal's pause control
During an active recording, AudioRecordingModal renders _buildPauseResumeButton, whose localized button toggles AudioRecorderController.pause() and resume() and changes between pause and play states. Saying these methods are not surfaced gives maintainers and feature-parity work the opposite description of the current recording UI; document the control that is already available.
AGENTS.md reference: AGENTS.md:L111-L114
Useful? React with 👍 / 👎.
#3600 moved the daily_os_next architecture out of the feature README and into knowledge/features/daily_os_next/, which landed after this branch was cut. The prose belongs there now: - dependency-aware-planning.md gains the two-carrier table and why the corpus alone was not enough. - evaluation.md gains the third visibility flag and the re-read of blockedWithoutCorpus.
#3600 moved the daily_os_next architecture out of the feature README and into knowledge/features/daily_os_next/, which landed after this branch was cut. The prose belongs there now: - dependency-aware-planning.md gains the two-carrier table and why the corpus alone was not enough. - evaluation.md gains the third visibility flag and the re-read of blockedWithoutCorpus.
Adopts the Open Knowledge Format v0.2 as the home for Lotti's architecture documentation, and splits documentation by audience.
The split
lib/features/<x>/README.mdknowledge/features/<x>/docs/adr/No fact is written twice. All 40 READMEs under
lib/became product descriptions: 19,269 lines → 1,654. The architecture they carried is now 88 concepts underknowledge/.The bundle
Every concept carries
type,title,description,status,generated,stale_afterandsourcespointing back at the code it was derived from.verifiedis deliberately unset — that field records independent confirmation, and self-certifying generated text would defeat it. Reviewers addingverified: { by: human:<id>, at: ... }is the intended way to raise a concept's trust tier.What keeps it from rotting
tool/okf/validates OKF §11 conformance, but the load-bearing check is stricter: every markdown link and everysources[].resourceleaving the bundle must resolve to a real path in the repo, or CI fails. A rename that invalidates the docs breaks the build for the person holding the context to fix it.make okf_check.github/workflows/okf-validate.yml(newKnowledge Bundlecheck)test/tool/okf/, including one that guards the real bundleAGENTS.mdstates the split rule and requiresmake okf_checkafter touchingknowledge/It earned its keep during the migration, catching
profile_locality.dartdocumented underutil/when it lives inhelpers/, and two Daily OS prompt files documented underagents/domain/after they had moved.Stale content found while grounding
Writing each concept against the code rather than copying prose surfaced drift the READMEs had accumulated:
SyncMessagehas twenty families —consumptionEventwas missing from the listSyncSequencePayloadTypehas seven members, not sixcalpast-start exemption that fix: close three ways a day plan could reference work it should not #3596 removedAlso
lib/features/sync/current_architecture.md→docs/architecture/sync_current_architecture.md. An investigation log is not product documentation.yamladded todev_dependenciesfor the validator.Rebase note
Rebased onto
mainafter #3596–#3598. Those three PRs had just edited four of the READMEs this branch rewrites, so the architecture facts they added were carried into the concepts in a separate commit rather than dropped — includingautomaticAgentWakesEnabled,inferenceRouteIdentityTiers, theDesignSystemButtondensetier, and the tightened Daily OS write-path guards.Verification
flutter analyzeclean across the project, formatter clean, validator tests pass, bundle validates with 0 errors, 0 warnings.Tracked in the maintainer tracker as
lotti3-arp.