requirements-inventory.md

Requirements inventory

Phase 1 of specs/PLAN.md. This file splits the Ledger PRD into atomic statements, then adds each scoping answer (D1–D8) and each change request (C1–C9). It does not decide the conflicts. Phase 2 writes those decisions.

Each row is one testable behavior, constraint, or principle. IDs start at REQ-001 and are never reused. Source is a PRD anchor (prd:…) or an id in specs/source/decisions-and-changes.md (decisions:D1, decisions:C3). Sources are not line numbers.

Kind is functional, non-functional, constraint, principle, or example. Feature is F01–F22 or X, from the feature table in PLAN section 4. Status is against the code on this branch:

StatusWhen it is used
builtThe stated behavior is in the code
partly builtPart of the stated behavior is in the code
not startedThe full v1 scope (D1) includes it, and it is not in the code
deferredD3, D4, or D5 postpones it. The statement stays the later target
replacedA later instruction in PLAN section 2.2 superseded this value. The row named in Flags is the one that stands

Flags name a conflict from PLAN section 2.2 or a gap from section 2.3, and the ADR that decides it. On a replaced PRD row, stands: C4 or stands: C2, C8 names the later instruction that wins. That instruction's own row is marked stands. Auth (D3) and storage (D2, D5) are conflicts, and they are not marked replaced: D3 keeps the four roles as a later target, and D1 still includes the Postgres model. The product name stays markdown-kb (D6, ADR-0001). A page is /{project}/{page-path}, for example /guide/docs/layout. /docs and /ledger redirect into the guide project. There is no /memento segment and no /docs/… page prefix. Preview is the default. Editing is a block editor in the reading column. Source is a full-page editor. Command-/ or Control-/ switches between those two, and the Edit button turns editing on from preview and off from either mode (ADR-0004). Inline live preview is not started. Reading text is 17px with line-height 1.7. The column is capped at 760px. At that size 66ch is 744px, so the cap binds and the text is 696px wide (ADR-0005).

A local stdio MCP, browser history, and zip import exist in the code. They are not the PRD's remote tools, revisions, or validated import. Those PRD statements stay not started, deferred, or partly built as the row says.

Statements

IDSourceKindFeatureStatusStatementFlags
REQ-001prd:summaryprincipleXreplacedThe product name is Ledger.conflict:name; stands: D6; ADR-0001
REQ-002prd:summaryprincipleF12not startedAgents propose changes, and a person merges them before they become documents.—
REQ-003prd:summaryprincipleXbuiltThe product does not generate, rewrite, or summarize content.—
REQ-004prd:summaryfunctionalF22not startedThe first space holds harness versions, evals, experiments, findings, and decisions so that performance can be measured over time.—
REQ-005prd:product-principlesprincipleF01partly builtEvery document is a Markdown file with YAML frontmatter.—
REQ-006prd:product-principlesprincipleF02not startedType schemas, templates, space settings, and agent instructions are Markdown files.—
REQ-007prd:product-principlesprincipleF19partly builtExport produces the same folder of Markdown files that the space stores.gap:export-identity; ADR-0033
REQ-008prd:product-principlesprincipleXbuiltThe product never generates, rewrites, or summarizes. Intelligence stays in the agents people bring.—
REQ-009prd:product-principlesprincipleXpartly builtThe product stores and displays documents, and it validates, diffs, and versions them.—
REQ-010prd:product-principlesprincipleF13deferredAgents can propose changes and have no merge tool.—
REQ-011prd:product-principlesprincipleF13deferredAgents have no delete tool and no admin tool.—
REQ-012prd:product-principlesprincipleF02not startedSix document types with required fields make knowledge queryable.—
REQ-013prd:product-principlesprincipleF16not startedExperiments feed metrics automatically.—
REQ-014prd:product-principlesprincipleF07not startedEvery change is an immutable revision.conflict:storage; ADR-0003
REQ-015prd:product-principlesprincipleF18partly builtChange over time is a first-class view, not an afterthought.—
REQ-016prd:product-principlesprincipleXpartly builtThere is one way to do each thing, and a feature that needs a manual is cut.—
REQ-017prd:product-principlesprincipleF20partly builtEvery core action has a keyboard shortcut.gap:a11y; ADR-0034
REQ-018prd:product-principlesprincipleF21builtThe interface is dark, dense, fast, and quiet, at Cursor-grade craft.gap:perf-percentile
REQ-019prd:usersconstraintF15deferredv1 has one owner, who runs experiments, reviews proposals, reads trends, and makes decisions.conflict:auth; ADR-0002
REQ-020prd:usersconstraintF13deferredAgents, including Cursor, Claude Code, Grokbot, and eval scripts, read context and propose documents.—
REQ-021prd:usersconstraintF15deferredCollaborators are a v1.1 audience: people invited to a space to read, propose, or edit.—
REQ-022prd:goals-for-v1functionalF22not startedv1 has one home for all Memento experiment knowledge, replacing artifacts as the source of truth.—
REQ-023prd:goals-for-v1functionalF13deferredAny MCP agent can log an experiment in one tool call, without GitHub or a CLI, including a phone assistant connected by OAuth.—
REQ-024prd:goals-for-v1non-functionalF12not startedReviewing a proposal takes under two minutes.—
REQ-025prd:goals-for-v1functionalF16not startedA chart shows each Memento metric over time, split by harness version.gap:repeat-experiment; ADR-0027
REQ-026prd:goals-for-v1functionalF13deferredAn agent can pull a compact context pack at the start of a session.gap:token-budget; ADR-0028
REQ-027prd:non-goalsconstraintXbuiltThe product does not include AI writing, summarizing, chat, or search by embedding.—
REQ-028prd:non-goalsconstraintXbuiltThe product does not include real-time multiplayer editing.—
REQ-029prd:non-goalsconstraintXbuiltThe product does not include Notion-style databases, kanban boards, or page builders.—
REQ-030prd:non-goalsconstraintXbuiltThe product does not publish public documentation sites or offer custom domains.—
REQ-031prd:non-goalsconstraintXbuiltv1 has no plugins, no integrations marketplace, and no outbound webhooks.—
REQ-032prd:non-goalsconstraintXbuiltv1 has no native mobile app. The client is the web app.—
REQ-033prd:non-goalsconstraintF08replacedOn phones the web app is responsive and read-mostly.conflict:phones; stands: C4; ADR-0011
REQ-034prd:success-metricsnon-functionalXnot startedAfter 30 days, 100 percent of new Memento experiments are recorded in the product.gap:metric-events
REQ-035prd:success-metricsnon-functionalF12not startedAfter 30 days, 80 percent or more of experiments arrive via agent proposals.gap:metric-events
REQ-036prd:success-metricsnon-functionalF12not startedThe median time from proposal to merge or reject is under 2 minutes of review time.gap:metric-events
REQ-037prd:success-metricsnon-functionalF06not startedAfter agents read the guide, under 10 percent of proposals fail validation.gap:metric-events
REQ-038prd:success-metricsnon-functionalXnot startedAn optional signal is that 5 external builders use a space weekly.gap:metric-events
REQ-039prd:core-conceptsconstraintF07not startedThe product has five nouns: space, document, revision, proposal, and agent key. Every other surface is a view over them.—
REQ-040prd:core-conceptsconstraintF07not startedA space is a top-level knowledge base with members, agent keys, types, and settings.conflict:auth; ADR-0002
REQ-041prd:core-conceptsconstraintF08replacedA space is addressed at /memento.conflict:name; stands: D6; ADR-0001
REQ-042prd:core-conceptsconstraintF01partly builtA document is one Markdown file at a path.—
REQ-043prd:core-conceptsconstraintF02not startedA document's type comes from its frontmatter.—
REQ-044prd:core-conceptsconstraintF07partly builtA document is never hard-deleted. It is archived instead.gap:legal-delete
REQ-045prd:core-conceptsconstraintF07not startedA revision is an immutable snapshot of a document's full content.conflict:storage; ADR-0003
REQ-046prd:core-conceptsconstraintF07not startedA revision is created only by a human save or a merged proposal, and it records author, message, and parent.conflict:storage; ADR-0003
REQ-047prd:core-conceptsconstraintF12not startedA proposal is a suggested create or update waiting for review, created by an agent or a contributor.—
REQ-048prd:core-conceptsconstraintF12not startedA proposal can be merged, rejected, or withdrawn.—
REQ-049prd:core-conceptsconstraintF13deferredAn agent key is a credential scoped to one space that can read and propose, and cannot merge, delete, or administer.—
REQ-050prd:document-typesconstraintF02not startedThe harness type is a versioned agent setup: model, context strategy, tools, and prompts.—
REQ-051prd:document-typesconstraintF02not startedThe eval type is a repeatable test with defined metrics, units, and direction.—
REQ-052prd:document-typesconstraintF02not startedThe experiment type is one run of an eval against a harness version, with results.—
REQ-053prd:document-typesconstraintF02not startedThe finding type is a durable conclusion backed by linked experiments.—
REQ-054prd:document-typesconstraintF02not startedThe decision type is a choice and the findings behind it.—
REQ-055prd:document-typesconstraintF02not startedThe doc type is free-form: architecture, notes, specs, and ideas. The other five types link together.—
REQ-056prd:recording-pipelineprincipleF03not startedAn experiment runs an eval against a harness version.—
REQ-057prd:recording-pipelineprincipleF03not startedA finding cites experiments as evidence.—
REQ-058prd:recording-pipelineprincipleF03not startedA decision cites findings, and a decision produces the next harness version.—
REQ-059prd:recording-pipelineexampleF03not startedThe pipeline diagram illustrates that loop and is not a separate behavior.—
REQ-060prd:versioned-referencesconstraintF02not startedHarnesses and evals carry a version number in frontmatter.—
REQ-061prd:versioned-referencesfunctionalF03not startedA link written slug@7 resolves to the revision where version 7 was first saved, so later harness edits do not change what the experiment ran on.gap:pinned-target; ADR-0017
REQ-062prd:custom-typesfunctionalF02not startedA space adds a type by adding a schema file. No code change is required.gap:meta-schema; ADR-0015
REQ-063prd:custom-typesfunctionalF02not startedv1 ships the six built-in types as editable schema files.gap:schema-frontmatter; ADR-0014
REQ-064prd:markdown-formatprincipleF01partly builtA space is a folder of Markdown files.conflict:storage; ADR-0003
REQ-065prd:markdown-formatconstraintF07not startedThe database stores revisions of those files.conflict:storage; ADR-0003
REQ-066prd:markdown-formatprincipleF01partly builtThe file format is the contract shared by import, export, the editor, and the MCP server.—
REQ-067prd:folder-layoutconstraintF01not startedA space folder contains .ledger/space.md for the name, description, default harness, and conventions.gap:schema-frontmatter; ADR-0014
REQ-068prd:folder-layoutconstraintF01not startedA space folder contains .ledger/agents.md, the instructions every agent reads first.gap:schema-frontmatter; ADR-0014
REQ-069prd:folder-layoutconstraintF02not started.ledger/types/ holds one schema file per built-in type: harness, eval, experiment, finding, decision, and doc.gap:schema-frontmatter; ADR-0014
REQ-070prd:folder-layoutexampleF01not startedThe sample tree, with harnesses/, evals/, experiments/, findings/, decisions/, docs/, and assets/, illustrates that layout.—
REQ-071prd:folder-layoutconstraintF01partly builtThe file name is the slug: lowercase, hyphens, and unique in the space.gap:slug; ADR-0012
REQ-072prd:folder-layoutconstraintF02not startedEach type has a default folder, set in its schema.gap:filename; ADR-0013
REQ-073prd:folder-layoutconstraintF01not startedExperiment file names are prefixed with their date.gap:filename; ADR-0013
REQ-074prd:folder-layoutconstraintF01partly builtFolders beyond the type folders are allowed for doc files.—
REQ-075prd:frontmatter-per-typeconstraintF01partly builtEvery file starts with YAML frontmatter.—
REQ-076prd:frontmatter-per-typeconstraintF02not startedtype and title are required on every file.—
REQ-077prd:frontmatter-harnessconstraintF02not startedA harness records version, model, a parent link, and a changes note.—
REQ-078prd:frontmatter-harnessconstraintF02not startedA harness status is draft, active, or retired.—
REQ-079prd:frontmatter-harnessconstraintF02not startedA harness body has the sections Context strategy, Prompts, Tools, and Known limits.—
REQ-080prd:frontmatter-harnessexampleF02not startedThe harness sample, including "Memento journal harness" at version 7, illustrates the format and is not a real stored result.—
REQ-081prd:frontmatter-evalconstraintF02not startedAn eval records version, a baseline link, and a metrics list.gap:baseline-value; ADR-0026
REQ-082prd:frontmatter-evalconstraintF02not startedAn eval status is draft, active, or retired.—
REQ-083prd:frontmatter-evalconstraintF02not startedEach eval metric has a key, a unit, a better direction of higher or lower, and an optional range.—
REQ-084prd:frontmatter-evalconstraintF02not startedAn eval body has the sections What it measures, Dataset, Scoring method, and How to run.—
REQ-085prd:frontmatter-evalexampleF02not startedThe summary-faithfulness sample illustrates an eval and is not a real stored result.—
REQ-086prd:frontmatter-experimentconstraintF02not startedAn experiment records date, hypothesis, a pinned harness link, a pinned eval link, environment, sample size, results, and verdict.—
REQ-087prd:frontmatter-experimentconstraintF02not startedAn experiment status is planned, running, concluded, or abandoned.—
REQ-088prd:frontmatter-experimentconstraintF02not startedAn experiment verdict is supported, refuted, or inconclusive.—
REQ-089prd:frontmatter-experimentconstraintF02not startedAn experiment body has the sections Setup, Observations, Surprises, and Next.—
REQ-090prd:frontmatter-experimentexampleF02not startedThe context-window sample illustrates an experiment and is not a real stored result.—
REQ-091prd:frontmatter-findingconstraintF02not startedA finding records confidence, an evidence list of links, and an optional supersedes link.—
REQ-092prd:frontmatter-findingconstraintF02not startedA finding status is current, superseded, or disputed.—
REQ-093prd:frontmatter-findingconstraintF02not startedFinding confidence is low, medium, or high.—
REQ-094prd:frontmatter-findingconstraintF02not startedA finding body has the sections Claim, Evidence summary, and Caveats.—
REQ-095prd:frontmatter-findingexampleF02not startedThe summaries-degrade sample illustrates a finding and is not a real stored result.—
REQ-096prd:frontmatter-decisionconstraintF02not startedA decision records date, a based_on list of finding links, and a results_in link.—
REQ-097prd:frontmatter-decisionconstraintF02not startedA decision status is proposed, accepted, or reversed.—
REQ-098prd:frontmatter-decisionconstraintF02not startedA decision body has the sections Decision, Why, Alternatives considered, and Revisit when.—
REQ-099prd:frontmatter-decisionconstraintF02not startedA doc requires only type doc and title, and may include a tags list.—
REQ-100prd:frontmatter-decisionexampleF02not startedThe sample values in the type frontmatter are illustrations of the format, not real Memento results.—
REQ-101prd:type-schemasconstraintF02not startedEach file in .ledger/types/ defines a type. Its frontmatter is the schema and its body is writing guidance sent to agents with the template.gap:schema-frontmatter; ADR-0014
REQ-102prd:type-schemasconstraintF02not startedA type schema sets name, folder, and a filename pattern. The experiment pattern is {date}-{slug}.gap:filename; ADR-0013
REQ-103prd:type-schemasconstraintF02not startedA type schema file uses type schema.gap:schema-frontmatter; ADR-0014
REQ-104prd:type-schemasconstraintF02not startedv1 field kinds are string, number, date, enum, boolean, list, link, links, and metrics.—
REQ-105prd:type-schemasconstraintF02not startedA string field may set required and max. The experiment title is a required string of at most 120 characters.—
REQ-106prd:type-schemasconstraintF02not startedA date field stores a date. Experiment date is required.—
REQ-107prd:type-schemasconstraintF02not startedAn enum field lists allowed values. Experiment status and verdict use the enums in the schema.—
REQ-108prd:type-schemasconstraintF02not startedExperiment hypothesis is a required string. Environment is an optional string. Sample size is an optional number with minimum 1.—
REQ-109prd:type-schemasconstraintF03not startedA link field may set to and pinned. Experiment harness and eval links are required, pinned, and limited to those types.—
REQ-110prd:type-schemasconstraintF03not startedpinned true requires an @version on the link.gap:pinned-target; ADR-0017
REQ-111prd:type-schemasconstraintF02not startedA metrics field's keys must match the linked eval's metric keys. Experiment results use that kind, taken from the eval.—
REQ-112prd:type-schemasconstraintF02not startedrequired_when makes a field required when another field matches. Experiment verdict is required when status is concluded.gap:required-when; ADR-0016
REQ-113prd:type-schemasconstraintF02not startedA schema lists required body sections. Experiment sections are Setup, Observations, Surprises, and Next.—
REQ-114prd:type-schemasexampleF02not startedThe experiment schema's writing guidance says to write one experiment per file, state the hypothesis before results, and report every metric the eval defines, even when it got worse.—
REQ-115prd:linksfunctionalF03builtslug links to a document's latest revision.—
REQ-116prd:linksfunctionalF03not startedslug@7 links to a harness or eval at a specific version.gap:pinned-target; ADR-0017
REQ-117prd:linksfunctionalF03builtHeading links to a section.—
REQ-118prd:linksfunctionalF03partly builtLinks work in frontmatter strings and in the body.—
REQ-119prd:linksfunctionalF06partly builtA broken link renders in red, and a broken link in frontmatter fails validation.—
REQ-120prd:linksfunctionalF03partly builtBacklinks are computed when links change and are shown on every document.—
REQ-121prd:space-and-agentsconstraintF01not startedspace.md holds the space name, a one-paragraph purpose, and the current default harness and eval.gap:schema-frontmatter; ADR-0014
REQ-122prd:space-and-agentsconstraintF13deferredagents.md is the rulebook returned by get_context: what to log, naming, and what not to do.—
REQ-123prd:space-and-agentsconstraintF01not startedspace.md and agents.md are ordinary documents, versioned and editable like any other document.gap:schema-frontmatter; ADR-0014
REQ-124prd:agent-logs-an-experimentnon-functionalF13deferredLogging an experiment takes one sentence from the user, one proposal, and under 10 seconds.gap:perf-percentile
REQ-125prd:agent-logs-an-experimentfunctionalF13deferredThe agent calls get_template for experiment, searches for the active harness, then propose_change with a create and the content.—
REQ-126prd:agent-logs-an-experimentfunctionalF13deferredA valid propose_change returns the proposal id and a valid status, and the proposal appears in the inbox.—
REQ-127prd:agent-logs-an-experimentfunctionalF06not startedWhen validation fails, propose_change returns structured errors, the agent fixes and resubmits, and nothing invalid reaches the inbox.—
REQ-128prd:agent-logs-an-experimentexampleF13deferredThe sequence diagram illustrates that tool order and is not a separate behavior.—
REQ-129prd:review-and-mergefunctionalF12not startedThe Inbox badge shows the count of new proposals. G I opens the Inbox.—
REQ-130prd:review-and-mergefunctionalF12not startedOpening a proposal shows a rendered diff, a frontmatter table, validation status, and the agent name.—
REQ-131prd:review-and-mergefunctionalF12not startedIn review, M merges, R rejects with a reason, and C requests changes with a note.gap:keymap-scope; ADR-0024
REQ-132prd:review-and-mergefunctionalF12not startedOn merge, a revision is created, links and metrics update, and the next proposal opens.—
REQ-133prd:write-or-editfunctionalF09partly builtOwners and editors edit in place.conflict:auth; ADR-0002
REQ-134prd:write-or-editfunctionalF09partly builtCommand-S saves a revision with an optional message.conflict:storage; ADR-0003
REQ-135prd:write-or-editfunctionalF06not startedHumans go through the same validation as agents, and a human may save a document that has warnings.—
REQ-136prd:session-with-contextfunctionalF13deferredget_context returns agents.md, the active harness, active evals, current findings, recent decisions, and the last 10 experiments.gap:token-budget; ADR-0028
REQ-137prd:session-with-contextnon-functionalF13deferredThat pack is about 2 to 6 thousand tokens, trimmed to titles and frontmatter, so the agent does not read the whole space.gap:token-budget; ADR-0028
REQ-138prd:metrics-over-timefunctionalF16not startedMetrics lets the reader pick an eval and a metric.—
REQ-139prd:metrics-over-timefunctionalF16not startedThe chart shows every concluded experiment over time, colored by harness version, with the baseline as a dashed line.gap:baseline-value; ADR-0026
REQ-140prd:metrics-over-timefunctionalF16not startedChoosing a point opens that experiment.—
REQ-141prd:distill-a-findingfunctionalF09not startedFrom an experiment, Command-Shift-F starts a new finding with that experiment pre-linked as evidence.—
REQ-142prd:distill-a-findingfunctionalF03not startedLater experiments can cite or dispute a finding, and superseding creates a visible chain.—
REQ-143prd:import-existing-workfunctionalF19partly builtDragging a folder of Markdown files onto the space imports them as revisions.gap:import-batch; ADR-0032
REQ-144prd:import-existing-workconstraintXbuiltLedger does not convert Claude artifacts or HTML. An agent converts them outside the product and submits proposals.—
REQ-145prd:capture-from-phonefunctionalF14deferredFrom a phone, a person can tell Claude, ChatGPT, or Muse to log an observation. The assistant calls get_template, then propose_change.—
REQ-146prd:capture-from-phonefunctionalF12not startedThat proposal waits in the Inbox until a person merges or expands it.—
REQ-147prd:ui-and-screensfunctionalF08replacedThe app is a three-pane layout: sidebar, main content, and an optional right panel for properties, backlinks, and history.conflict:panel; stands: C7; ADR-0008
REQ-148prd:ui-and-screensconstraintF08not startedv1 has eight screens.—
REQ-149prd:layoutexampleF08replacedThe layout sketch shows a space switcher, search, Inbox, Timeline, Metrics, type groups, a document, and a properties column with backlinks and history.conflict:panel; stands: C7; ADR-0008
REQ-150prd:screensfunctionalF22not startedSpace home orients the reader with space.md, the active harness, the latest 5 experiments, the open proposal count, and current findings.—
REQ-151prd:screensconstraintF08replacedScreen routes are /memento, /memento/experiments/…, /memento/inbox, /memento/inbox/42, /memento/…/history, /memento/timeline, /memento/metrics, and /memento/settings.conflict:name; stands: D6; ADR-0001
REQ-152prd:screensfunctionalF08partly builtThe document screen is for reading and editing, and shows the title, a property header, and the body.—
REQ-153prd:screensfunctionalF08replacedOn the document screen, click or E starts editing.conflict:editor; stands: C8; ADR-0004
REQ-154prd:screensfunctionalF12not startedThe Inbox is the review queue. Each row shows agent, action, document, summary, validation, and age, and filters cover open, changes requested, and closed.—
REQ-155prd:screensfunctionalF12not startedThe proposal screen reviews one change: rendered diff, frontmatter diff, validation, rationale, and actions.—
REQ-156prd:screensfunctionalF18partly builtHistory shows change over time for one document as a revision list, and can restore a revision.gap:history-restore; ADR-0030
REQ-157prd:screensfunctionalF18not startedHistory can compare any two revisions.gap:history-restore; ADR-0030
REQ-158prd:screensfunctionalF18not startedTimeline shows what changed in the space: merged revisions grouped by day, filtered by type and author.—
REQ-159prd:screensfunctionalF16not startedThe Metrics screen answers whether results are improving, with eval and metric pickers, a line chart, and a harness comparison table.—
REQ-160prd:screensfunctionalF10replacedSettings is an admin screen for members, agent keys, types, import, and export.conflict:modals; stands: C6; ADR-0009
REQ-161prd:sidebarfunctionalF08partly builtThe sidebar leads with a space switcher, then Search, Inbox with the open count, Timeline, and Metrics.—
REQ-162prd:sidebarfunctionalF08not startedThe sidebar has one collapsible group per type, sorted newest first, and experiments show a status dot.—
REQ-163prd:sidebarfunctionalF08partly builtDoc files appear as a folder tree.—
REQ-164prd:sidebarfunctionalF09not startedA plus on each type group creates a document from that type's template.—
REQ-165prd:document-viewfunctionalF08partly builtThe property header renders frontmatter as a compact two-column list, and links render as chips.—
REQ-166prd:document-viewfunctionalF16not startedIn the property header, a metric shows its value and an up or down mark against the eval baseline, colored by the metric's better direction.gap:delta-baseline; ADR-0026
REQ-167prd:document-viewfunctionalF04replacedThe body renders Markdown at a maximum width of 720 pixels.conflict:reading; stands: C4; ADR-0005
REQ-168prd:document-viewfunctionalF04partly builtHeadings in the body have anchor links.—
REQ-169prd:document-viewfunctionalF08replacedCommand-backslash toggles a right panel of properties, backlinks grouped by type, and the last 5 revisions with authors.conflict:panel; stands: C7; ADR-0008
REQ-170prd:document-viewfunctionalF08not startedA harness page adds a version list, and each version links to its experiments.—
REQ-171prd:document-viewfunctionalF16not startedAn eval page adds a small metric chart and a table of experiments that use it.—
REQ-172prd:document-viewfunctionalF08not startedA finding page lists evidence with each experiment's verdict, and shows the supersedes chain.—
REQ-173prd:empty-statesfunctionalF22not startedEvery empty screen teaches the model in one line, offers one action, and uses no illustration.gap:ui-states
REQ-174prd:empty-statesexampleF12not startedThe Inbox empty state reads: No proposals. Connect an agent in Settings, then Agent keys.gap:ui-states
REQ-175prd:editorconstraintF09replacedThe editor is CodeMirror 6 with live preview, in the style of Obsidian and Cursor.conflict:editor; stands: C2, C8; ADR-0004
REQ-176prd:editorprincipleF09partly builtThe Markdown source is the truth. The editor never rewrites text the user did not touch, so diffs stay clean.—
REQ-177prd:editor-behaviorfunctionalF09replacedLive preview renders headings, bold, links, and lists inline, and the syntax shows on the line with the cursor.conflict:editor; stands: C2; ADR-0004
REQ-178prd:editor-behaviorfunctionalF09replacedCommand-slash toggles raw source.conflict:editor; stands: C2; ADR-0004
REQ-179prd:editor-behaviorfunctionalF09not startedThe property header is a form generated from the type schema. Enums are dropdowns, links are pickers, and dates are date inputs.—
REQ-180prd:editor-behaviorfunctionalF09not startedEditing a frontmatter field writes YAML, and raw source shows that YAML directly.—
REQ-181prd:editor-behaviorfunctionalF03partly builtTyping [[ opens a picker of documents, and @ chooses a version for harnesses and evals.—
REQ-182prd:editor-behaviorfunctionalF09partly builtThe slash menu inserts structure only: headings, a table, a code block, a callout, a checklist, an image, and a link. It has no AI items.—
REQ-183prd:editor-behaviorfunctionalF09not startedPasting or dropping an image uploads it into assets/ and inserts a standard Markdown image link.—
REQ-184prd:editor-behaviorfunctionalF04partly builtTables are GitHub-flavored Markdown tables, and Tab moves between cells.—
REQ-185prd:editor-behaviorfunctionalF04builtFenced code blocks show syntax highlighting.—
REQ-186prd:savingfunctionalF07not startedDrafts autosave every 2 seconds to the server as an unsaved draft, private to the author.conflict:storage; ADR-0003
REQ-187prd:savingfunctionalF09partly builtLeaving and returning restores the author's draft.conflict:storage; ADR-0003
REQ-188prd:savingfunctionalF09not startedCommand-S validates, then opens an optional one-line commit message. Enter skips the message. Saving creates a revision.conflict:storage; ADR-0003
REQ-189prd:savingfunctionalF06not startedWhen validation has errors, the save is blocked and the errors show inline next to the field or line.—
REQ-190prd:savingfunctionalF12not startedA contributor, who can only propose, sees Propose instead of Save, and that action creates a proposal.conflict:auth; ADR-0002
REQ-191prd:conflictsfunctionalF09not startedIf another revision lands during editing, a banner says: This document changed. Review changes.—
REQ-192prd:conflictsfunctionalF09not startedSaving then runs a three-way merge. A clean merge saves with a note.gap:merge-frontmatter; ADR-0022
REQ-193prd:conflictsfunctionalF09not startedA conflict opens a side-by-side resolver with your version, theirs, and the base.gap:merge-frontmatter; ADR-0022
REQ-194prd:new-documentsfunctionalF09partly builtC or the plus control opens creation of a new document.gap:keymap-scope; ADR-0024
REQ-195prd:new-documentsfunctionalF02not startedNew documents start from a type picker. The type schema's template fills the body and the frontmatter form, and required fields stay highlighted until filled.—
REQ-196prd:new-documentsfunctionalF01not startedThe file name is generated from the schema's filename pattern and stays editable.gap:filename; ADR-0013
REQ-197prd:markdown-capabilitiesfunctionalF04partly builtThe renderer covers GitHub-flavored Markdown, plus math, Mermaid diagrams, live charts, and embeds.—
REQ-198prd:markdown-capabilitiesprincipleF04builtEvery Markdown feature uses standard or widely adopted syntax, so files stay portable and agents already know how to write them.—
REQ-199prd:supported-syntaxfunctionalF04builtCore Markdown renders headings, bold, italic, lists, links, images, blockquotes, and horizontal rules, on the CommonMark baseline.—
REQ-200prd:supported-syntaxfunctionalF04builtGitHub-flavored pipe tables keep column alignment and scroll horizontally on narrow screens.—
REQ-201prd:supported-syntaxfunctionalF04not startedTask lists use the GitHub checkbox syntax. An editor can tick a box in view mode, and each tick saves a revision.gap:task-tick; ADR-0031
REQ-202prd:supported-syntaxfunctionalF04builtStrikethrough and autolinks follow GitHub-flavored Markdown.—
REQ-203prd:supported-syntaxfunctionalF04partly builtFootnotes use the GitHub footnote syntax, with a hover preview and back-links.—
REQ-204prd:supported-syntaxfunctionalF04builtCallouts use GitHub alert syntax: NOTE, TIP, IMPORTANT, WARNING, and CAUTION, so they also render on GitHub.—
REQ-205prd:supported-syntaxfunctionalF04partly builtFenced code uses Shiki highlighting, a copy button, a diff language, and line highlights such as {3-5}.—
REQ-206prd:supported-syntaxfunctionalF04partly builtMath uses dollar inline math, dollar-dollar blocks, or a math fence, rendered with KaTeX on the server.—
REQ-207prd:supported-syntaxfunctionalF04builtA mermaid fence renders every Mermaid diagram type the library supports, including flowchart, sequence, class, state, ER, Gantt, journey, pie, quadrant, XY, timeline, mindmap, git graph, Sankey, block, and architecture.—
REQ-208prd:supported-syntaxfunctionalF05partly builtA chart fence holds a Vega-Lite spec in YAML or JSON. Data may be inline, from a space CSV, or live from metrics.—
REQ-209prd:supported-syntaxfunctionalF04builtA csv or tsv fence renders as a sortable table.—
REQ-210prd:supported-syntaxfunctionalF04partly builtHighlight uses text. Subscript and superscript use the tilde and caret short syntax.—
REQ-211prd:supported-syntaxfunctionalF04not startedEmoji shortcodes such as :rocket: render as emoji.—
REQ-212prd:supported-syntaxfunctionalF03partly builtWiki links support slug, slug@7, and Heading.gap:pinned-target; ADR-0017
REQ-213prd:supported-syntaxfunctionalF03partly builtAn embed transcludes another document or a section with slug, slug, or slug@7, and links to its source.gap:pinned-target; ADR-0017
REQ-214prd:supported-syntaxfunctionalF04partly builtImages use standard Markdown and zoom on click. Video links to .mp4 or .webm in assets/ get a player.—
REQ-215prd:supported-syntaxconstraintXbuiltThe only HTML that renders is details, summary, kbd, sub, sup, mark, br, and img width. All other HTML is stripped.—
REQ-216prd:supported-syntaxfunctionalF08builtAn outline is built automatically from headings and shown beside the document. No outline syntax is required.conflict:panel; ADR-0008
REQ-217prd:supported-syntaxconstraintF04deferredGraphviz dot diagrams, geojson and topojson maps, and stl 3D models are planned for v1.1, matching GitHub, and are out of v1.—
REQ-218prd:chartsconstraintF05partly builtCharts use Vega-Lite only. A chart takes data from inline values, a CSV file in assets/, or a live metrics query against the space.—
REQ-219prd:chartsexampleF05not startedThe faithfulness-by-harness sample is a line chart whose data is a metrics query on summary-faithfulness version 2.—
REQ-220prd:chartsfunctionalF05not startedA metrics-backed chart updates whenever a new experiment merges. A finding or decision can embed that live chart.—
REQ-221prd:chartsfunctionalF16not startedA metrics query returns date, value, harness, harness version, eval version, environment, sample size, verdict, and experiment.—
REQ-222prd:chartsfunctionalF05partly builtEvery Vega-Lite chart type works, including line, bar, area, scatter, stacked, grouped, histogram, heatmap, box plot, layered, and faceted charts.—
REQ-223prd:chartsfunctionalF05partly builtCharts show tooltips, use the app's theme colors, and offer a menu to export PNG or SVG.—
REQ-224prd:chartsconstraintF05partly builtExternal data URLs are not allowed. Chart data comes only from inline values, space assets, or metrics.—
REQ-225prd:editor-supportfunctionalF09partly builtLive preview renders diagrams, charts, and math inline. Moving the cursor into a block reveals its source with a live preview underneath.conflict:editor; ADR-0004
REQ-226prd:editor-supportfunctionalF04partly builtA render error shows inline with the line number and the parser message, and the last good render stays visible above it.—
REQ-227prd:editor-supportfunctionalF09partly builtThe slash menu inserts starters for Mermaid diagram types, charts from metrics or a CSV or a selected table, math, callouts, footnotes, CSV blocks, embeds, and details.—
REQ-228prd:editor-supportfunctionalF05not startedChart from table converts a selected Markdown table into a chart block with the values inline. The transform is deterministic, not AI.—
REQ-229prd:charts-in-reviewfunctionalF12not startedA changed diagram or chart renders before and after, side by side, with the source diff underneath.—
REQ-230prd:charts-in-reviewfunctionalF12not startedMath, callouts, and embeds render inside the rendered diff.—
REQ-231prd:performance-and-safetynon-functionalF04partly builtKaTeX and Shiki render on the server. Mermaid and Vega-Lite render in the browser, lazy-loaded only on pages that use them, and the rendered SVG is cached by content hash.—
REQ-232prd:performance-and-safetyconstraintXbuiltMermaid runs at its strict security level.—
REQ-233prd:performance-and-safetyconstraintF05partly builtChart specs are validated against the Vega-Lite schema and a data-source allowlist.—
REQ-234prd:performance-and-safetyconstraintF03builtEmbeds resolve at most three levels deep and never loop.gap:embed-limit; ADR-0020
REQ-235prd:portabilityconstraintF04builtOn GitHub, tables, task lists, footnotes, callouts, math, and Mermaid use syntax that GitHub renders. Chart blocks and embeds stay readable as plain source.—
REQ-236prd:portabilityfunctionalF19not startedExport can optionally add a static SVG snapshot under each chart for tools that cannot render Vega-Lite.—
REQ-237prd:proposals-and-reviewconstraintF12not startedA proposal is a suggested create or update against a specific base revision.—
REQ-238prd:proposals-and-reviewprincipleF12not startedReview is the product's signature experience and gets the most design care.—
REQ-239prd:proposal-lifecyclefunctionalF12not startedA valid propose_change creates a proposal with status open. An invalid submission creates no proposal and returns errors.—
REQ-240prd:proposal-lifecyclefunctionalF12not startedA reviewer can move an open proposal to changes_requested. update_proposal moves it back to open.—
REQ-241prd:proposal-lifecyclefunctionalF12not startedA reviewer can merge or reject an open proposal. The author can withdraw an open proposal.—
REQ-242prd:proposal-lifecyclefunctionalF12not startedA reviewer can reject a proposal that is in changes_requested.—
REQ-243prd:proposal-lifecycleconstraintF12not startedMerged, rejected, and withdrawn are terminal statuses.—
REQ-244prd:proposal-lifecyclefunctionalF12not startedA proposal left open for 30 days is marked stale and stays open.—
REQ-245prd:proposal-contentsconstraintF12not startedA proposal action is create or update. Rename, archive, and delete are human-only.gap:rename; ADR-0018
REQ-246prd:proposal-contentsconstraintF12not startedA proposal has a target path. An update requires base_revision_id, the revision the agent read.—
REQ-247prd:proposal-contentsconstraintF12not startedProposal content is either the full new Markdown or a list of find-and-replace pairs applied to the base.gap:edits-match; ADR-0021
REQ-248prd:proposal-contentsconstraintF12not startedA proposal summary is one required line of at most 120 characters. Rationale is an optional paragraph.—
REQ-249prd:proposal-contentsconstraintF12not startedThe author is an agent key label plus the owning user, or a human contributor.—
REQ-250prd:review-screenfunctionalF12not startedThe review header shows summary, author with an agent glyph, action, target path, age, and a validation badge.—
REQ-251prd:review-screenfunctionalF12not startedThe default diff is rendered. Insertions are highlighted green, deletions are struck in red, and unchanged sections collapse to one expandable line.—
REQ-252prd:review-screenfunctionalF12not startedD toggles a line-level Markdown source diff.—
REQ-253prd:review-screenfunctionalF12not startedThe frontmatter diff is a table of field, before, and after. A metric change shows the delta.gap:delta-baseline; ADR-0026
REQ-254prd:review-screenfunctionalF12not startedA new document is shown fully rendered with a new tag, not as a diff.—
REQ-255prd:review-screenfunctionalF12not startedRationale, when present, is shown under the header.—
REQ-256prd:review-screenfunctionalF12not startedReview actions are Merge (M), Request changes (C, which requires a note), Reject (R, with an optional reason), Next (J), Previous (K), and Edit before merge (E).gap:keymap-scope; ADR-0024
REQ-257prd:review-screenfunctionalF12not startedEdit before merge lets the reviewer fix a typo and merge in one step. The revision records both the agent and the reviewer.gap:keymap-scope; ADR-0024
REQ-258prd:diff-enginefunctionalF12not startedThe diff parses both versions into Markdown blocks, aligns blocks by position and similarity, then runs a word-level diff inside changed blocks.gap:diff-similarity; ADR-0023
REQ-259prd:diff-engineprincipleF12not startedThe diff is prose-readable rather than a line diff.gap:diff-similarity; ADR-0023
REQ-260prd:merge-and-conflictsfunctionalF12not startedWhen base_revision_id equals the current head, the proposal merges directly.—
REQ-261prd:merge-and-conflictsfunctionalF12not startedWhen the base is not the head, merge runs a three-way merge of base, head, and proposal.gap:merge-frontmatter; ADR-0022
REQ-262prd:merge-and-conflictsfunctionalF12not startedA clean rebase shows "Rebased onto latest" and merges normally.—
REQ-263prd:merge-and-conflictsfunctionalF12not startedA conflict marks the proposal conflicted. The reviewer resolves it side by side, or requests changes so the agent re-reads and resubmits.—
REQ-264prd:on-mergefunctionalF07not startedMerge runs in one database transaction: create the revision, move the document head, recompute links and backlinks, write metric points for experiments, and log an audit event.conflict:storage; ADR-0003
REQ-265prd:on-mergefunctionalF13deferredAfter merge, get_proposal shows the agent that the proposal is merged.—
REQ-266prd:mcp-and-apifunctionalF13deferredThe product hosts a remote MCP server at /api/mcp using the official MCP TypeScript SDK and Streamable HTTP.—
REQ-267prd:mcp-and-apifunctionalF13deferredAn agent connects with a URL and either an API key or an OAuth sign-in, with no CLI and no GitHub.—
REQ-268prd:mcp-and-apifunctionalF13deferredA REST API mirrors the same operations for scripts.—
REQ-269prd:connecting-an-agentfunctionalF13deferredSettings, then Agent keys, shows a pre-filled MCP snippet with the space's bearer key.—
REQ-270prd:connecting-an-agentfunctionalF13deferredThat screen has copy buttons for Cursor, Claude Code, and a generic client.—
REQ-271prd:connecting-an-agentexampleF13deferredThe sample mcp.json, with a ledger URL and an Authorization bearer header, illustrates that snippet.—
REQ-272prd:connecting-assistantsprincipleF14deferredOne MCP endpoint serves every client. Developer tools send API keys. Consumer assistants use OAuth. Both paths reach the same ten tools.—
REQ-273prd:connecting-assistantsfunctionalF13deferredCursor connects through mcp.json with a URL and a header, using an API key.—
REQ-274prd:connecting-assistantsfunctionalF13deferredClaude Code connects with claude mcp add, a URL, and a header, using an API key.—
REQ-275prd:connecting-assistantsfunctionalF14deferredClaude on the web, desktop, and mobile connects as a custom connector with the MCP URL, using OAuth.—
REQ-276prd:connecting-assistantsfunctionalF14deferredChatGPT connects as a custom connector or developer-mode MCP, where the plan supports it, using OAuth.—
REQ-277prd:connecting-assistantsfunctionalF14deferredMeta Muse connects as a custom connector with the MCP URL, using OAuth. A directory listing comes later.—
REQ-278prd:connecting-assistantsfunctionalF13deferredGrokbot, eval scripts, and other clients use the REST API or MCP with an API key.—
REQ-279prd:connecting-assistantsfunctionalF13deferredSettings, then Connect, shows one card per client with its setup steps, a copy button, and a link to that client's current docs.—
REQ-280prd:oauth-for-mcpconstraintF14deferredMCP authorization is OAuth 2.1 with PKCE, protected-resource metadata at /.well-known/oauth-protected-resource, authorization-server metadata, and dynamic client registration.—
REQ-281prd:oauth-for-mcpconstraintF14deferredThe only scopes are read and propose. read means "Read documents, templates and metrics in this space". propose means "Suggest new or changed documents for your review; cannot publish anything".—
REQ-282prd:oauth-for-mcpfunctionalF14deferredThe consent screen lets the user pick the space and the scopes. A grant is always tied to one space.—
REQ-283prd:oauth-for-mcpconstraintF14deferredAccess tokens last 1 hour. Refresh tokens last 30 days, rotate on use, and are revoked with the grant.—
REQ-284prd:oauth-for-mcpconstraintF14deferredThere is no merge scope, so no assistant can be granted publishing power.—
REQ-285prd:capture-from-anywherefunctionalF14deferredA spoken note becomes a proposal. The assistant files it as an experiment with status planned, or as a doc note, and it waits in the Inbox.—
REQ-286prd:capture-from-anywherefunctionalF06not startedValidation still applies to a captured note. A vague note returns a structured error the assistant can resolve by asking one follow-up question.—
REQ-287prd:toolsconstraintF13deferredThere are ten tools. All of them read, validate, or propose. None merge, delete, or administer.—
REQ-288prd:toolsfunctionalF13deferredget_context accepts an optional detail of brief or full, and returns agents.md, the active harness, active evals with metric definitions, current findings, accepted decisions, and the last 10 experiments as frontmatter only.gap:token-budget; ADR-0028
REQ-289prd:toolsfunctionalF13deferredlist_documents accepts optional type, status, limit defaulting to 50, and cursor, and returns paths, titles, types, status, and updated dates.—
REQ-290prd:toolsfunctionalF13deferredread_document accepts a path or slug and an optional version, and returns Markdown, parsed frontmatter, revision id, and backlinks.—
REQ-291prd:toolsfunctionalF13deferredsearch accepts a query, an optional type, and a limit defaulting to 20, and returns hits with path, title, snippet, and score.gap:search-score; ADR-0029
REQ-292prd:toolsfunctionalF13deferredget_template accepts a type and returns template Markdown, the field schema, writing guidance, and the filename pattern.—
REQ-293prd:toolsfunctionalF06not startedvalidate accepts a path and content and returns valid, errors, and warnings, without creating anything.—
REQ-294prd:toolsfunctionalF12not startedpropose_change accepts action, path, optional content, optional edits, optional base revision, summary, and optional rationale, and returns proposal id, status, and url, or validation errors.gap:edits-match; ADR-0021
REQ-295prd:toolsfunctionalF13deferredget_proposal accepts a proposal id and returns status, reviewer notes, and the merged revision id.—
REQ-296prd:toolsfunctionalF12not startedupdate_proposal accepts a proposal id and optional content, edits, and summary, and revises the proposal only when changes were requested.—
REQ-297prd:toolsfunctionalF16not startedget_metrics accepts an eval and optional metric and harness, and returns a time series of metric points with experiment links.—
REQ-298prd:toolsconstraintF13deferredThe space comes from the key. Tools never take a space argument.—
REQ-299prd:error-formatfunctionalF06not startedEvery error is structured so an agent can self-correct: valid false, and errors with field, code, message, and hint.—
REQ-300prd:error-formatexampleF06not startedThe sample link_unpinned error, telling the agent to use a versioned harness link and stating the active version, illustrates that shape.—
REQ-301prd:tool-descriptionsfunctionalF13deferredEach tool description tells the agent the workflow: call get_context first, get_template before creating, validate when unsure, one document per proposal, and never invent metric values.—
REQ-302prd:tool-descriptionsfunctionalF13deferredagents.md repeats those rules in the space owner's words. get_context and get_template also return a short syntax reference for callouts, Mermaid, math, embeds, and charts, including a metrics-backed chart example.—
REQ-303prd:rest-apiconstraintF13deferredThe REST API uses the same auth header, JSON in and out, under /api/v1.—
REQ-304prd:rest-apifunctionalF13deferredGET /context maps to get_context.—
REQ-305prd:rest-apifunctionalF13deferredGET /documents, with optional type and status, maps to list_documents.—
REQ-306prd:rest-apifunctionalF13deferredGET /documents/{path} maps to read_document.—
REQ-307prd:rest-apifunctionalF13deferredGET /search maps to search.gap:search-score; ADR-0029
REQ-308prd:rest-apifunctionalF13deferredGET /templates/{type} maps to get_template.—
REQ-309prd:rest-apifunctionalF06not startedPOST /validate maps to validate.—
REQ-310prd:rest-apifunctionalF12not startedPOST /proposals maps to propose_change. GET /proposals/{id} maps to get_proposal. PATCH /proposals/{id} maps to update_proposal.—
REQ-311prd:rest-apifunctionalF16not startedGET /metrics maps to get_metrics.—
REQ-312prd:rest-apifunctionalF13deferredEval scripts can post experiment results through the REST API with no agent in the loop.—
REQ-313prd:limitsconstraintF13deferredEach key allows 60 requests per minute and 30 proposals per hour. Beyond that the server returns 429 with retry-after.gap:rate-limit-oauth; ADR-0025
REQ-314prd:limitsconstraintF01not startedA document may be at most 200 KB.—
REQ-315prd:limitsconstraintF12not startedA key may have at most 20 open proposals.—
REQ-316prd:limitsconstraintF06not startedA proposal identical to the current head is rejected as no_change.—
REQ-317prd:validationprincipleF06not startedValidation is fully deterministic. The same validator runs on agent proposals, human saves, imports, and the validate tool.—
REQ-318prd:validation-rulesconstraintF06not startedyaml_invalid is an error when frontmatter does not parse as YAML.—
REQ-319prd:validation-rulesconstraintF06not startedtype_unknown is an error when type does not match a schema in .ledger/types/.gap:schema-frontmatter; ADR-0014
REQ-320prd:validation-rulesconstraintF06not startedfield_missing is an error when a required field is absent, including a required_when condition.gap:required-when; ADR-0016
REQ-321prd:validation-rulesconstraintF06not startedfield_kind is an error when a value does not match its kind: a date must be ISO, a number must be numeric, and an enum must be an allowed value.—
REQ-322prd:validation-rulesconstraintF06not startedfield_unknown is a warning when a frontmatter key is not in the schema.—
REQ-323prd:validation-rulesconstraintF06not startedlink_broken is an error in frontmatter and a warning in the body when the linked slug does not exist.gap:archived-link; ADR-0019
REQ-324prd:validation-rulesconstraintF06not startedlink_unpinned is an error when a pinned link field has no @version.gap:pinned-target; ADR-0017
REQ-325prd:validation-rulesconstraintF06not startedversion_missing is an error when the pinned version does not exist.gap:pinned-target; ADR-0017
REQ-326prd:validation-rulesconstraintF06not startedmetric_unknown is an error when a results key is not defined on the linked eval.—
REQ-327prd:validation-rulesconstraintF06not startedmetric_missing is a warning when a concluded experiment omits an eval metric.—
REQ-328prd:validation-rulesconstraintF06not startedmetric_range is an error when a value falls outside the metric's declared range.—
REQ-329prd:validation-rulesconstraintF06not startedpath_invalid is an error when the path does not match the type's folder and filename pattern.gap:filename; ADR-0013
REQ-330prd:validation-rulesconstraintF06not startedslug_taken is an error when a create collides with an existing slug.gap:slug; ADR-0012
REQ-331prd:validation-rulesconstraintF06not startedbase_missing is an error when an update has no real base revision.—
REQ-332prd:validation-rulesconstraintF06not startedversion_not_bumped is a warning when harness or eval content changes without a version increase.gap:pinned-target; ADR-0017
REQ-333prd:validation-rulesconstraintF06not startedsection_missing is a warning when a schema section is not present as a heading.—
REQ-334prd:validation-rulesconstraintF06not startedno_change is an error when content does not differ from the head.—
REQ-335prd:validation-rulesconstraintF06not startedtoo_large is an error when content is not under 200 KB.—
REQ-336prd:validation-behaviorfunctionalF06not startedErrors block proposals and saves. Warnings show on the review screen and in the editor, and they do not block.—
REQ-337prd:validation-behaviorfunctionalF06not startedEvery error carries a field or a line, a code, a plain message, and a hint with the likely fix.—
REQ-338prd:validation-behaviorconstraintF06not startedValidation is a pure function of the content, the type schemas, and the space's current documents, and it is unit-tested heavily.—
REQ-339prd:validation-behaviorfunctionalF06not startedEditing a type schema does not re-validate existing documents. They stay as written and are checked on their next change.—
REQ-340prd:validation-behaviorfunctionalF06not startedRendering checks are body warnings, so a broken diagram never blocks a finding: chart_invalid, math_invalid, embed_broken, and mermaid_invalid.—
REQ-341prd:validation-behaviorfunctionalF04partly builtChart and math checks run on the server. Mermaid checks run in the editor and on the review screen.—
REQ-342prd:measurement-layerprincipleF16not startedMetrics come from merged experiment frontmatter. Nothing is entered twice.—
REQ-343prd:measurement-layerfunctionalF16not startedWhen an experiment with status concluded merges, each results value becomes a metric point.—
REQ-344prd:metric-pointconstraintF16not startedA metric point takes eval and eval version from the experiment's pinned eval link.gap:pinned-target; ADR-0017
REQ-345prd:metric-pointconstraintF16not startedA metric point takes the metric key, unit, and better direction from the eval's metrics definition, and the value from the experiment's results.—
REQ-346prd:metric-pointconstraintF16not startedA metric point takes harness and harness version from the experiment's pinned harness link, and the date from the experiment.—
REQ-347prd:metric-pointconstraintF16not startedA metric point copies environment and sample size from the experiment, and records the experiment and the merged revision.—
REQ-348prd:metric-pointfunctionalF16not startedWhen a concluded experiment is later edited, its points are replaced by the new revision's values, and history keeps the old values.—
REQ-349prd:metrics-screenfunctionalF16not startedThe eval picker defaults to the space's default eval, and a metric picker follows it.—
REQ-350prd:metrics-screenfunctionalF16not startedThe over-time chart uses experiment date on x and the metric on y. Points are colored by harness version and connected per version. The eval baseline is a dashed line.gap:baseline-value; gap:repeat-experiment; ADR-0026; ADR-0027
REQ-351prd:metrics-screenfunctionalF16not startedHover shows the experiment title, value, and sample size. Click opens the experiment.—
REQ-352prd:metrics-screenfunctionalF16not startedThe harness comparison table has one row per harness version, with n, mean, median, best, latest, and delta versus baseline. Deltas are green or red according to the metric's better direction.gap:delta-baseline; ADR-0026
REQ-353prd:metrics-screenfunctionalF16not startedCompare two versions: pick A and B and see every metric side by side with deltas.gap:delta-baseline; ADR-0026
REQ-354prd:comparability-rulesconstraintF16not startedResults from different eval versions never share a chart line. Changing an eval's method means bumping its version, and the chart splits.—
REQ-355prd:comparability-rulesfunctionalF16not startedExperiments with verdict inconclusive still plot, drawn hollow. Abandoned experiments produce no points.—
REQ-356prd:comparability-rulesconstraintF16not startedv1 shows descriptive numbers only: n, mean, median, min, and max. It runs no significance tests, and the sample size is always visible.—
REQ-357prd:setting-up-mementofunctionalF22deferredThe first session seeds one harness per distinct setup found in existing artifacts, one eval per repeatable test, and one experiment per recorded run.—
REQ-358prd:setting-up-mementofunctionalF22not startedThe metrics each eval tracks are defined by the owner when writing the eval files.—
REQ-359prd:setting-up-mementofunctionalF22not startedThe screens stay useful before seeding is complete. One eval and three experiments are enough for a first chart.—
REQ-360prd:auth-permissions-and-sharingconstraintF15deferredHumans sign in with sessions. Agents use scoped API keys or OAuth grants. The two never mix.conflict:auth; ADR-0002
REQ-361prd:auth-permissions-and-sharingconstraintF13deferredAn agent key cannot open the web app, and a browser session cannot propose on an agent's behalf.conflict:auth; ADR-0002
REQ-362prd:human-sign-inconstraintF15deferredHuman sign-in uses Better Auth or Auth.js, with GitHub OAuth, Google OAuth, and email magic link. There are no passwords.conflict:auth; ADR-0002
REQ-363prd:human-sign-inconstraintF15deferredSessions are stored in the database and sent as httpOnly, Secure, SameSite=Lax cookies, with a 30-day rolling expiry.conflict:auth; ADR-0002
REQ-364prd:human-sign-inconstraintF15deferredEvery mutation has CSRF protection, and every server action checks membership and role on the server.conflict:auth; ADR-0002
REQ-365prd:rolesconstraintF15deferredAn owner can read, propose, edit directly, merge, and manage members, keys, and types.conflict:auth; ADR-0002
REQ-366prd:rolesconstraintF15deferredAn editor can read, propose, edit directly, and merge, and cannot manage members, keys, or types.conflict:auth; ADR-0002
REQ-367prd:rolesconstraintF15deferredA contributor can read and propose, and cannot edit directly, merge, or manage members, keys, or types.conflict:auth; ADR-0002
REQ-368prd:rolesconstraintF15deferredA viewer can read, and cannot propose, edit, merge, or manage.conflict:auth; ADR-0002
REQ-369prd:agent-keysfunctionalF13deferredOwners and editors create keys in Settings, then Agent keys. Each key has a label, a scope of read or propose, and an owning user.—
REQ-370prd:agent-keysconstraintF13deferredA key has the form lk_, the space, and 32 random characters. It is shown once and stored as a SHA-256 hash plus a visible prefix.—
REQ-371prd:agent-keysfunctionalF13deferredA key shows last used time and proposal count. Revoking takes effect immediately.—
REQ-372prd:agent-keysconstraintF13deferredA key can never merge, edit directly, archive, manage members, or read another space.—
REQ-373prd:oauth-grantsfunctionalF14deferredEvery OAuth connection appears in Settings, then Agents, beside API keys, labeled by client and user.—
REQ-374prd:oauth-grantsfunctionalF14deferredEach grant shows its space, scopes, last used time, and proposal count. Revoking kills its tokens immediately.—
REQ-375prd:oauth-grantsfunctionalF12not startedProposals from OAuth grants carry the same agent glyph and label as key-based agents.—
REQ-376prd:sharingfunctionalF11replacedA person invites by email with a role, and the invite expires after 7 days.conflict:sharing; stands: C8; ADR-0010
REQ-377prd:sharingfunctionalF11replacedA space has an optional public read-only link, off by default. A public view never shows proposals, keys, or members.conflict:sharing; stands: C8; ADR-0010
REQ-378prd:sharingfunctionalF15deferredEvery privileged action writes an audit event: merges, rejects, role changes, key creation, and key revocation.conflict:auth; ADR-0002
REQ-379prd:security-basicsconstraintXbuiltRendered Markdown is sanitized, and HTML is limited to the safe subset in Markdown capabilities.—
REQ-380prd:security-basicsconstraintF19not startedUploaded assets are served from signed URLs.—
REQ-381prd:security-basicsconstraintXpartly builtAll secrets live in environment variables. No keys are shipped in client code.—
REQ-382prd:architecture-and-data-modelconstraintXpartly builtv1 is one Next.js app on Vercel, one Postgres database, and one blob store.conflict:storage; ADR-0003
REQ-383prd:architecture-and-data-modelconstraintXbuiltv1 has no queues, no workers, and no separate MCP service.—
REQ-384prd:stackconstraintXpartly builtThe app is Next.js App Router, TypeScript, and React. Mutations go through server actions.—
REQ-385prd:stackconstraintXbuiltHosting is Vercel, for deploys and preview URLs.—
REQ-386prd:stackconstraintF07not startedThe database is Postgres on Neon with Drizzle ORM.conflict:storage; ADR-0003
REQ-387prd:stackconstraintF15deferredAuth is Better Auth, including its OAuth provider for MCP clients.conflict:auth; ADR-0002
REQ-388prd:stackconstraintF13deferredMCP uses the official TypeScript SDK as Streamable HTTP at /api/mcp.—
REQ-389prd:stackconstraintF04partly builtMarkdown uses one parser for render, diff, links, and validation: unified, remark-parse, remark-gfm, remark-frontmatter, a wiki-link plugin, remark-math, rehype-katex, Shiki, Mermaid, and rehype-sanitize.—
REQ-390prd:stackconstraintF09replacedThe editor stack is CodeMirror 6 with a live-preview extension.conflict:editor; stands: C2, C8; ADR-0004
REQ-391prd:stackconstraintF12not startedWord diffs use jsdiff. Three-way merges use node-diff3.gap:merge-frontmatter; ADR-0022
REQ-392prd:stackconstraintF06not startedValidation uses Zod schemas generated from the type schema files, and the same validator runs on server and client.—
REQ-393prd:stackconstraintF17not startedSearch is Postgres full-text search plus pg_trgm, with no embeddings and no extra service.gap:search-score; ADR-0029
REQ-394prd:stackconstraintF05partly builtCharts use Vega-Lite through vega-embed, one engine for document charts and the Metrics screen.—
REQ-395prd:stackconstraintF08partly builtThe UI uses Tailwind CSS, Radix primitives, and cmdk for the command palette.conflict:modals; ADR-0009
REQ-396prd:stackconstraintF19not startedAssets use Vercel Blob or Cloudflare R2, with signed URLs.—
REQ-397prd:data-modelconstraintF15deferredusers stores id, email, name, avatar url, and created time. spaces stores id, slug, name, a public-read flag, and created time. memberships stores space, user, role, and created time.conflict:auth; ADR-0002
REQ-398prd:data-modelconstraintF07not starteddocuments stores id, space, path, slug, type, title, head revision, archived time, and created and updated times.conflict:storage; gap:legal-delete; ADR-0003
REQ-399prd:data-modelconstraintF07not startedrevisions stores id, document, parent revision, full content, frontmatter, content hash, optional version, message, author user, optional agent key, optional proposal, and created time.conflict:storage; ADR-0003
REQ-400prd:data-modelconstraintF12not startedproposals stores the action, path, optional base revision, content, optional edits, summary, rationale, status, validation, author, reviewer, review note, and merged revision.gap:edits-match; ADR-0021
REQ-401prd:data-modelconstraintF07not starteddrafts stores document, user, content, and updated time.conflict:storage; ADR-0003
REQ-402prd:data-modelconstraintF13deferredagent_keys stores space, owner, label, scope, key prefix, key hash, last used time, revoked time, and created time.—
REQ-403prd:data-modelconstraintF03not startedlinks stores the source document, target slug, optional target version, whether the link is in frontmatter, and the field.gap:pinned-target; ADR-0017
REQ-404prd:data-modelconstraintF16not startedmetric_points stores the experiment document, revision, eval slug and version, metric key, value, harness slug and version, date, environment, sample size, and verdict.—
REQ-405prd:data-modelconstraintF19not startedassets stores space, path, blob url, mime type, size, and created time.—
REQ-406prd:data-modelconstraintF15deferredaudit_events stores space, actor user, agent key, action, target, data, and created time.conflict:auth; ADR-0002
REQ-407prd:invariantsconstraintF07not startedRevisions are immutable and store full content.conflict:storage; ADR-0003
REQ-408prd:invariantsconstraintF07not startedOnly two paths create revisions: a human save and a merge. Both run the validator.conflict:storage; ADR-0003
REQ-409prd:invariantsconstraintF07not starteddocuments.head_revision_id moves inside the same transaction that creates the revision.conflict:storage; ADR-0003
REQ-410prd:invariantsconstraintF07not startedlinks and metric_points are derived data and can be rebuilt from revisions with one script.—
REQ-411prd:invariantsconstraintF07partly builtDocuments are archived, never deleted.gap:legal-delete
REQ-412prd:invariantsfunctionalF03not startedA version lookup for slug@7 finds the first revision of that document whose version column equals 7.gap:pinned-target; ADR-0017
REQ-413prd:code-structureconstraintXnot startedScreens live under app/(app)/[space]. The MCP server is app/api/mcp/route.ts. REST lives under app/api/v1. Shared code is split into markdown, schema, validate, proposals, metrics, auth, and db.conflict:name; ADR-0001
REQ-414prd:code-structureprincipleXpartly builtThe MCP route, REST routes, and server actions call the same functions. There is one implementation of every operation.—
REQ-415prd:search-import-and-exportprincipleF19partly builtThe reader's data is always a folder of Markdown away.—
REQ-416prd:search-import-and-exportfunctionalF17partly builtSearch is keyword-based and fast.gap:search-score; gap:perf-percentile; ADR-0029
REQ-417prd:search-import-and-exportprincipleF19partly builtImport and export use the exact file format.gap:export-identity; ADR-0033
REQ-418prd:searchfunctionalF17partly builtCommand-K opens one palette for documents, commands, and filters.conflict:modals; ADR-0009
REQ-419prd:searchfunctionalF17partly builtSearch is full-text over title, body, and frontmatter values, ranked by title match, then recency.gap:search-score; ADR-0029
REQ-420prd:searchfunctionalF17not startedFilters can be typed inline, including type, status, harness, verdict, and after a date.—
REQ-421prd:searchnon-functionalF17partly builtA result shows a type icon, title, path, and a snippet with matches highlighted, in under 100 milliseconds for a space of up to 10,000 documents.gap:perf-percentile; gap:search-score; ADR-0029
REQ-422prd:importfunctionalF19partly builtA person can drag a folder or a zip of Markdown files onto Settings, then Import, or onto the sidebar.—
REQ-423prd:importfunctionalF19not startedEach imported file is validated. Valid files become documents with one initial revision each, authored Import.—
REQ-424prd:importfunctionalF19not startedInvalid files are listed with their errors and a Download report button. Nothing partial is saved for a file.gap:import-batch; ADR-0032
REQ-425prd:importfunctionalF19partly builtA file without frontmatter imports as type doc, with the file name as the title.—
REQ-426prd:importconstraintXbuiltConverting Claude artifacts or HTML is an agent's job. The product does not interpret them.—
REQ-427prd:exportfunctionalF19partly builtSettings, then Export, downloads a zip of the whole space as its folder of Markdown files, including .ledger/ and assets/. Re-importing that zip recreates the space.gap:export-identity; ADR-0033
REQ-428prd:exportfunctionalF19not startedAn optional per-document history export writes one file per revision under .history/.—
REQ-429prd:backupfunctionalF07not startedNeon point-in-time restore covers the database.conflict:storage; ADR-0003
REQ-430prd:backupconstraintF19deferredv1.1 adds a nightly job that pushes the space as Markdown to a private GitHub repo, one commit per night. That repo is a backup mirror, never an input.—
REQ-431prd:design-languageprincipleF21builtThe feel is Cursor: dark-first, dense, quiet, and fast. The content is the interface, and chrome gets out of the way.—
REQ-432prd:foundationsconstraintF10builtThe theme defaults to dark, light is available, and the theme can follow the system.—
REQ-433prd:foundationsconstraintF21replacedSurfaces are a near-black base, one step lighter for panels, with hairline 1 pixel borders and no shadows.conflict:surfaces; stands: C2; ADR-0006
REQ-434prd:foundationsconstraintF21builtOne accent color is used for focus, selection, and primary actions.—
REQ-435prd:foundationsconstraintF21partly builtGreen means improvement and insertions. Red means regression and deletions. Amber means warnings.—
REQ-436prd:foundationsconstraintF21partly builtUI type is Geist or Inter, at 13 pixels, with meta at 12 pixels.—
REQ-437prd:foundationsconstraintF21replacedReading type is 16 pixels, with 1.6 line height and a 720 pixel maximum width.conflict:reading; stands: C4; ADR-0005
REQ-438prd:foundationsconstraintF21partly builtPaths, keys, frontmatter, and code use Geist Mono or JetBrains Mono.—
REQ-439prd:foundationsconstraintF21replacedControls use a 6 pixel radius and panels use an 8 pixel radius.conflict:radius; stands: C5; ADR-0007
REQ-440prd:foundationsconstraintF21partly builtMotion is 120 to 160 milliseconds, ease-out, and content does not animate.—
REQ-441prd:interaction-rulesnon-functionalF20partly builtEverything is reachable by keyboard, and every list is navigable with J and K.gap:a11y; ADR-0034
REQ-442prd:interaction-rulesconstraintF20replacedPrefer inline editing and side panels over modals. The only modals are confirmations for irreversible actions.conflict:modals; stands: C6, C8; ADR-0009
REQ-443prd:interaction-rulesfunctionalF12not startedAgent authorship is always visible: a small agent glyph plus the key label on proposals, revisions, and timeline rows.—
REQ-444prd:interaction-rulesconstraintF21not startedStatus is a colored dot plus a word, never color alone.—
REQ-445prd:interaction-rulesfunctionalF08not startedLoading states are skeletons of the real layout. Merge and reject update optimistically.gap:ui-states
REQ-446prd:keyboard-shortcutsfunctionalF17partly builtCommand-K opens search and commands.conflict:modals; ADR-0009
REQ-447prd:keyboard-shortcutsfunctionalF09partly builtC creates a new document.gap:keymap-scope; ADR-0024
REQ-448prd:keyboard-shortcutsfunctionalF09partly builtE edits the current document.conflict:editor; gap:keymap-scope; ADR-0004; ADR-0024
REQ-449prd:keyboard-shortcutsfunctionalF09partly builtCommand-S saves a revision.conflict:storage; ADR-0003
REQ-450prd:keyboard-shortcutsfunctionalF12not startedG then I opens the Inbox, G then T opens Timeline, and G then M opens Metrics.—
REQ-451prd:keyboard-shortcutsfunctionalF12not startedIn review, M merges, R rejects, and C requests changes.gap:keymap-scope; ADR-0024
REQ-452prd:keyboard-shortcutsfunctionalF12not startedD toggles the rendered diff and the source diff.—
REQ-453prd:keyboard-shortcutsfunctionalF20not startedJ and K move to the next and previous item.gap:a11y; ADR-0034
REQ-454prd:keyboard-shortcutsfunctionalF08builtCommand-backslash toggles the right-hand column.conflict:panel; ADR-0008
REQ-455prd:keyboard-shortcutsfunctionalF09replacedCommand-slash toggles raw Markdown.conflict:editor; stands: C2; ADR-0004
REQ-456prd:keyboard-shortcutsfunctionalF20built? shows all shortcuts.conflict:modals; ADR-0009
REQ-457prd:build-planconstraintXpartly builtThe minimum useful loop is milestones 1 through 4. Everything after that can wait.—
REQ-458prd:build-planconstraintXpartly builtMilestone 1, Foundation, is the Next.js app, Neon, the Drizzle schema, Better Auth, one space, and seeded .ledger/ files.conflict:storage; conflict:auth; ADR-0003; ADR-0002
REQ-459prd:build-planconstraintF04partly builtMilestone 2, Read path, is the Markdown parser with full rendering, the type schema loader, the validator with tests, the document view, and the sidebar.—
REQ-460prd:build-planconstraintF13deferredMilestone 3, Agent path, is agent keys, OAuth 2.1, the MCP route with all read tools plus validate and propose_change, and the REST mirror.—
REQ-461prd:build-planconstraintF12not startedMilestone 4, Review, is the Inbox, a rendered word diff, merge and reject, revisions, and get_proposal.—
REQ-462prd:build-planconstraintF16not startedMilestone 5, Metrics, is metric-point derivation on merge, the Metrics screen, and harness comparison.—
REQ-463prd:build-planconstraintF09partly builtMilestone 6, Human editing, is CodeMirror live preview, the frontmatter form, drafts, Command-S revisions, and conflicts.conflict:editor; ADR-0004
REQ-464prd:build-planconstraintF18partly builtMilestone 7, Polish, is history and compare, Timeline, the search palette, import and export, and invites.conflict:sharing; ADR-0010
REQ-465prd:acceptance-milestones-1-4functionalF13deferredAC-01. From Cursor, the sentence "log this experiment to Ledger" produces a valid proposal with no manual fixes, using only MCP tools.conflict:name; ADR-0001
REQ-466prd:acceptance-milestones-1-4functionalF06not startedAC-02. An invalid proposal returns structured errors, and the agent's retry succeeds.—
REQ-467prd:acceptance-milestones-1-4non-functionalF12not startedAC-03. The proposal appears in the Inbox within 2 seconds.gap:perf-percentile
REQ-468prd:acceptance-milestones-1-4functionalF12not startedAC-04. Merging creates a revision, updates the document, and marks the proposal merged for get_proposal.—
REQ-469prd:acceptance-milestones-1-4functionalF13deferredAC-05. An agent key cannot merge, and a revoked key is refused immediately.—
REQ-470prd:acceptance-milestones-1-4non-functionalF13deferredAC-06. get_context returns under 6 thousand tokens for a space with 100 experiments.gap:token-budget; ADR-0028
REQ-471prd:acceptance-milestones-1-4functionalF14deferredAC-07. Claude and Muse connect by pasting the MCP URL, signing in, and approving scopes, with no key copied by hand.—
REQ-472prd:acceptance-milestones-1-4functionalF14deferredAC-08. OAuth grants appear in Settings, then Agents, and revoking one blocks its next call.—
REQ-473prd:acceptance-milestones-1-4constraintF13deferredAC-09. No OAuth scope or tool allows merging, editing directly, or deleting.—
REQ-474prd:acceptance-milestone-5functionalF16not startedAC-10. Merging a concluded experiment adds its points to the chart without a reload.—
REQ-475prd:acceptance-milestone-5functionalF16not startedAC-11. Two harness versions on the same eval show as separate colored series with correct deltas.gap:delta-baseline; ADR-0026
REQ-476prd:acceptance-milestone-5functionalF16not startedAC-12. Bumping an eval version splits the chart.—
REQ-477prd:acceptance-milestones-6-7functionalF09partly builtAC-13. Editing and saving an untouched document produces an empty diff.—
REQ-478prd:acceptance-milestones-6-7functionalF19partly builtAC-14. Exporting and re-importing a space yields identical files.gap:export-identity; ADR-0033
REQ-479prd:acceptance-milestones-6-7non-functionalF20partly builtAC-15. Every screen is usable with the keyboard alone.gap:a11y; ADR-0034
REQ-480prd:acceptance-milestones-6-7non-functionalF12not startedAC-16. Review of a typical experiment proposal takes under two minutes.—
REQ-481prd:acceptance-milestones-6-7functionalF04partly builtAC-17. A test document that uses every syntax in Markdown capabilities renders the same in the view, in the editor preview, and in review.—
REQ-482prd:acceptance-milestones-6-7functionalF05not startedAC-18. A metrics-backed chart embedded in a finding updates after a new experiment merges.—
REQ-483prd:risksconstraintXpartly builtIf building the product delays the Memento launch, stop after milestone 4 until Memento ships, and use a GitHub-style review until then.—
REQ-484prd:risksconstraintF12not startedInbox flooding is limited by validation, rate limits, a cap of 20 open proposals per key, and keyboard triage.gap:rate-limit-oauth; ADR-0025
REQ-485prd:risksconstraintF06not startedInvented or misreported metrics are limited by agents.md, the metric_unknown and range checks, and human review of every result.—
REQ-486prd:risksconstraintF02not startedSchemas that do not fit real experiments are handled by seeding from real artifacts first and by keeping schemas as editable Markdown.—
REQ-487prd:risksconstraintF09partly builtThe editor must not rewrite Markdown and pollute diffs. Source-first editing is checked by an acceptance test for an empty diff.—
REQ-488prd:risksconstraintF14deferredAssistant connector flows differ and change often. Follow the MCP authorization spec exactly, and test each client end to end before claiming support.—
REQ-489prd:risksconstraintF16not startedSmall samples must not read as real trends. Always show n, and draw inconclusive runs as hollow points.—
REQ-490decisions:D1constraintXpartly builtThe first implementation scope is full v1, milestones 1 through 7.—
REQ-491decisions:D2constraintXbuiltThe product is hosted on Vercel from the start, using the Vercel connection through Cursor.conflict:storage; ADR-0003
REQ-492decisions:D3constraintF15builtThere is no human sign-in yet.conflict:auth; ADR-0002
REQ-493decisions:D4constraintF13builtHow agents connect, whether by API keys only or also by MCP OAuth 2.1, is later work.—
REQ-494decisions:D5constraintF09builtThe first thing to run and show is the Markdown editor, before seeding Memento's sample documents.conflict:storage; ADR-0003
REQ-495decisions:D6constraintXbuiltThe product name in the UI is markdown-kb. A page is /{project}/{page-path}, for example /guide/docs/layout. /docs and /ledger redirect into the guide project. There is no /memento segment and no /docs/… page prefix.conflict:name; stands; ADR-0001
REQ-496decisions:D7constraintF15deferredOwner and Editor may save directly, Contributors propose, and agents never merge, as in the PRD.conflict:auth; ADR-0002
REQ-497decisions:D8constraintXpartly builtThe current scope is a Markdown editor with charts, Mermaid, and similar capabilities. Experiment run-log attachments are not in scope.—
REQ-498decisions:DprincipleF21builtReadability and the Markdown experience come first, using reference layouts from Cursor, Devin, and similar agentic tools.—
REQ-499decisions:C1constraintXbuiltHosting is a new Vercel project named markdown-kb-editor.—
REQ-500decisions:C2functionalF09builtPreview is the default. Editing is a block editor in the reading column, not a split pane. Source is a full-page editor. Command-/ or Control-/ switches between block editing and source. Inline live preview is not started. Hairline borders are removed in favor of solid fills.conflict:editor; conflict:surfaces; stands; ADR-0004; ADR-0006
REQ-501decisions:C3functionalF08builtThe left sidebar expands and retracts. When it retracts it is invisible, and a top-left icon brings it back. The choice persists.—
REQ-502decisions:C4constraintF21builtReading text is 17px with line-height 1.7. The column is capped at 760px. At that size 66ch is 744px, so the cap binds and the text is 696px wide. The split stacks on narrow screens, coarse pointers get 44px targets, and editing works on phones.conflict:reading; conflict:phones; stands; ADR-0005; ADR-0011
REQ-503decisions:C5constraintF21builtRadii are 12 pixels on controls, 10 pixels on outline rows, 18 pixels on content blocks, 20 pixels on dialogs, 8 pixels on inline code, and 6 pixels on marks.conflict:radius; stands; ADR-0007
REQ-504decisions:C6functionalF10builtSettings is a window with a section list and a content pane, structured like Cursor and Devin. Theme choices are Light, Dark, and System. Dark is used when the choice is unset.conflict:modals; stands; ADR-0009
REQ-505decisions:C7functionalF08builtFiles, the page, and the outline are three full-height columns. The title row and the status line share the page color.conflict:panel; stands; ADR-0008
REQ-506decisions:C8functionalXbuiltThe Edit button turns editing on from preview and off from either editing or source. A share sheet offers Anyone with the link, Can view or Can edit, and Copy link. The link sets the starting mode and grants no rights.conflict:editor; conflict:sharing; stands; ADR-0004; ADR-0010
REQ-507decisions:C9constraintXbuiltThe original product specs are reviewed and turned into detailed specs for spec-driven development, which is this plan.—

Narrative

These passages state no testable behavior. They have no requirement ID. A section can appear here and also have requirements, when only part of it is narrative.

SourcePassage
prd:product-requirementsThe title, the date 22 Sep 2026, and the author line. They name the document and state no behavior.
prd:summaryThe metaphor that this is GitHub for knowledge, and the list of example clients. The testable claims in this section have requirement IDs.
prd:problem-users-and-goalsThe problem, that Memento experiments are scattered with no way to compare harness versions, and the comparison of Notion, Obsidian, GitBook, Mintlify, OpenKnowledge, and Claude artifacts. This is motivation. It states no behavior the product must perform.
prd:usage-patternsThe framing that eight flows define v1, and that the product works if those flows feel effortless. Each flow is inventoried in the section that follows.
prd:agent-logs-an-experimentThe sequence diagram illustrates the tool order inventoried above. It adds no further rule.
prd:layoutThe box drawing is the sketch inventoried as an example. It adds no further rule.
prd:connecting-an-agentThe sample mcp.json illustrates the snippet inventoried above.
prd:proposal-lifecycleThe state diagram pictures the transitions inventoried above.
prd:error-formatThe JSON sample illustrates the error shape inventoried above.
prd:build-planThe day estimates, including about four and a half days for milestones 1 through 4 and each milestone's day count, are a schedule. They are not product behavior. The milestone scope is inventoried above. D1 keeps that scope.
prd:acceptance-criteriaThe heading only. The 18 criteria are inventoried in the three milestone sections.
prd:first-week-of-useAn operating plan for the owner: seed the space, have an agent convert existing artifacts into proposals, then log every run and check Metrics before a harness decision. It is not a system behavior.
prd:risks-and-open-questionsThe framing that time is the biggest risk, because the work competes with shipping Memento, and that the build plan front-loads the loop. Mitigations are inventoried under prd:risks.
prd:open-questionsSix questions stay open until answered. Two have partial answers: the name is markdown-kb for now (D6), and editors save directly (D7). Run-log attachments are out of the current scope (D8). Still open, with no owner decision beyond the PRD: whether get_context is configurable per space, which evals define the launch bar and their metrics and baselines, and confirming no overlap with day-job agreements before a public share. PLAN section 2.4 keeps the unanswered ones as tracked questions.

Coverage check

The Phase 1 check has two parts: every PRD section maps to at least one statement or is marked narrative, and each of the 18 acceptance criteria maps to a feature.

Requirements: 507.

Status counts: built 49, partly built 89, not started 260, deferred 88, replaced 21.

PRD sections

SectionCovered by
prd:product-requirementsnarrative only
prd:summary4 statements, REQ-001–REQ-004; also listed as narrative
prd:product-principles14 statements, REQ-005–REQ-018
prd:problem-users-and-goalsnarrative only
prd:users3 statements, REQ-019–REQ-021
prd:goals-for-v15 statements, REQ-022–REQ-026
prd:non-goals7 statements, REQ-027–REQ-033
prd:success-metrics5 statements, REQ-034–REQ-038
prd:core-concepts11 statements, REQ-039–REQ-049
prd:document-types6 statements, REQ-050–REQ-055
prd:recording-pipeline4 statements, REQ-056–REQ-059
prd:versioned-references2 statements, REQ-060–REQ-061
prd:custom-types2 statements, REQ-062–REQ-063
prd:markdown-format3 statements, REQ-064–REQ-066
prd:folder-layout8 statements, REQ-067–REQ-074
prd:frontmatter-per-type2 statements, REQ-075–REQ-076
prd:frontmatter-harness4 statements, REQ-077–REQ-080
prd:frontmatter-eval5 statements, REQ-081–REQ-085
prd:frontmatter-experiment5 statements, REQ-086–REQ-090
prd:frontmatter-finding5 statements, REQ-091–REQ-095
prd:frontmatter-decision5 statements, REQ-096–REQ-100
prd:type-schemas14 statements, REQ-101–REQ-114
prd:links6 statements, REQ-115–REQ-120
prd:space-and-agents3 statements, REQ-121–REQ-123
prd:usage-patternsnarrative only
prd:agent-logs-an-experiment5 statements, REQ-124–REQ-128; also listed as narrative
prd:review-and-merge4 statements, REQ-129–REQ-132
prd:write-or-edit3 statements, REQ-133–REQ-135
prd:session-with-context2 statements, REQ-136–REQ-137
prd:metrics-over-time3 statements, REQ-138–REQ-140
prd:distill-a-finding2 statements, REQ-141–REQ-142
prd:import-existing-work2 statements, REQ-143–REQ-144
prd:capture-from-phone2 statements, REQ-145–REQ-146
prd:ui-and-screens2 statements, REQ-147–REQ-148
prd:layout1 statement, REQ-149; also listed as narrative
prd:screens11 statements, REQ-150–REQ-160
prd:sidebar4 statements, REQ-161–REQ-164
prd:document-view8 statements, REQ-165–REQ-172
prd:empty-states2 statements, REQ-173–REQ-174
prd:editor2 statements, REQ-175–REQ-176
prd:editor-behavior9 statements, REQ-177–REQ-185
prd:saving5 statements, REQ-186–REQ-190
prd:conflicts3 statements, REQ-191–REQ-193
prd:new-documents3 statements, REQ-194–REQ-196
prd:markdown-capabilities2 statements, REQ-197–REQ-198
prd:supported-syntax19 statements, REQ-199–REQ-217
prd:charts7 statements, REQ-218–REQ-224
prd:editor-support4 statements, REQ-225–REQ-228
prd:charts-in-review2 statements, REQ-229–REQ-230
prd:performance-and-safety4 statements, REQ-231–REQ-234
prd:portability2 statements, REQ-235–REQ-236
prd:proposals-and-review2 statements, REQ-237–REQ-238
prd:proposal-lifecycle6 statements, REQ-239–REQ-244; also listed as narrative
prd:proposal-contents5 statements, REQ-245–REQ-249
prd:review-screen8 statements, REQ-250–REQ-257
prd:diff-engine2 statements, REQ-258–REQ-259
prd:merge-and-conflicts4 statements, REQ-260–REQ-263
prd:on-merge2 statements, REQ-264–REQ-265
prd:mcp-and-api3 statements, REQ-266–REQ-268
prd:connecting-an-agent3 statements, REQ-269–REQ-271; also listed as narrative
prd:connecting-assistants8 statements, REQ-272–REQ-279
prd:oauth-for-mcp5 statements, REQ-280–REQ-284
prd:capture-from-anywhere2 statements, REQ-285–REQ-286
prd:tools12 statements, REQ-287–REQ-298
prd:error-format2 statements, REQ-299–REQ-300; also listed as narrative
prd:tool-descriptions2 statements, REQ-301–REQ-302
prd:rest-api10 statements, REQ-303–REQ-312
prd:limits4 statements, REQ-313–REQ-316
prd:validation1 statement, REQ-317
prd:validation-rules18 statements, REQ-318–REQ-335
prd:validation-behavior6 statements, REQ-336–REQ-341
prd:measurement-layer2 statements, REQ-342–REQ-343
prd:metric-point5 statements, REQ-344–REQ-348
prd:metrics-screen5 statements, REQ-349–REQ-353
prd:comparability-rules3 statements, REQ-354–REQ-356
prd:setting-up-memento3 statements, REQ-357–REQ-359
prd:auth-permissions-and-sharing2 statements, REQ-360–REQ-361
prd:human-sign-in3 statements, REQ-362–REQ-364
prd:roles4 statements, REQ-365–REQ-368
prd:agent-keys4 statements, REQ-369–REQ-372
prd:oauth-grants3 statements, REQ-373–REQ-375
prd:sharing3 statements, REQ-376–REQ-378
prd:security-basics3 statements, REQ-379–REQ-381
prd:architecture-and-data-model2 statements, REQ-382–REQ-383
prd:stack13 statements, REQ-384–REQ-396
prd:data-model10 statements, REQ-397–REQ-406
prd:invariants6 statements, REQ-407–REQ-412
prd:code-structure2 statements, REQ-413–REQ-414
prd:search-import-and-export3 statements, REQ-415–REQ-417
prd:search4 statements, REQ-418–REQ-421
prd:import5 statements, REQ-422–REQ-426
prd:export2 statements, REQ-427–REQ-428
prd:backup2 statements, REQ-429–REQ-430
prd:design-language1 statement, REQ-431
prd:foundations9 statements, REQ-432–REQ-440
prd:interaction-rules5 statements, REQ-441–REQ-445
prd:keyboard-shortcuts11 statements, REQ-446–REQ-456
prd:build-plan8 statements, REQ-457–REQ-464; also listed as narrative
prd:acceptance-criterianarrative only
prd:acceptance-milestones-1-49 statements, REQ-465–REQ-473
prd:acceptance-milestone-53 statements, REQ-474–REQ-476
prd:acceptance-milestones-6-76 statements, REQ-477–REQ-482
prd:first-week-of-usenarrative only
prd:risks-and-open-questionsnarrative only
prd:risks7 statements, REQ-483–REQ-489
prd:open-questionsnarrative only

Section check: passed. 106 PRD sections, 99 with statements, 7 narrative only.

Acceptance criteria

CriterionRequirementFeature
AC-01REQ-465F13
AC-02REQ-466F06
AC-03REQ-467F12
AC-04REQ-468F12
AC-05REQ-469F13
AC-06REQ-470F13
AC-07REQ-471F14
AC-08REQ-472F14
AC-09REQ-473F13
AC-10REQ-474F16
AC-11REQ-475F16
AC-12REQ-476F16
AC-13REQ-477F09
AC-14REQ-478F19
AC-15REQ-479F20
AC-16REQ-480F12
AC-17REQ-481F04
AC-18REQ-482F05

Acceptance-criteria check: passed. All 18 criteria have a feature.

Phase 1 check: passed.

Conflicts (PLAN section 2.2)

TopicRequirements
nameREQ-001, REQ-041, REQ-151, REQ-413, REQ-465, REQ-495
authREQ-019, REQ-040, REQ-133, REQ-190, REQ-360, REQ-361, REQ-362, REQ-363, REQ-364, REQ-365, REQ-366, REQ-367, REQ-368, REQ-378, REQ-387, REQ-397, REQ-406, REQ-458, REQ-492, REQ-496
storageREQ-014, REQ-045, REQ-046, REQ-064, REQ-065, REQ-134, REQ-186, REQ-187, REQ-188, REQ-264, REQ-382, REQ-386, REQ-398, REQ-399, REQ-401, REQ-407, REQ-408, REQ-409, REQ-429, REQ-449, REQ-458, REQ-491, REQ-494
editorREQ-153, REQ-175, REQ-177, REQ-178, REQ-225, REQ-390, REQ-448, REQ-455, REQ-463, REQ-500, REQ-506
readingREQ-167, REQ-437, REQ-502
surfacesREQ-433, REQ-500
radiusREQ-439, REQ-503
panelREQ-147, REQ-149, REQ-169, REQ-216, REQ-454, REQ-505
modalsREQ-160, REQ-395, REQ-418, REQ-442, REQ-446, REQ-456, REQ-504
sharingREQ-376, REQ-377, REQ-464, REQ-506
phonesREQ-033, REQ-502

Gaps (PLAN section 2.3)

TopicRequirements
slugREQ-071, REQ-330
filenameREQ-072, REQ-073, REQ-102, REQ-196, REQ-329
schema-frontmatterREQ-063, REQ-067, REQ-068, REQ-069, REQ-101, REQ-103, REQ-121, REQ-123, REQ-319
meta-schemaREQ-062
required-whenREQ-112, REQ-320
pinned-targetREQ-061, REQ-110, REQ-116, REQ-212, REQ-213, REQ-324, REQ-325, REQ-332, REQ-344, REQ-403, REQ-412
renameREQ-245
archived-linkREQ-323
embed-limitREQ-234
edits-matchREQ-247, REQ-294, REQ-400
merge-frontmatterREQ-192, REQ-193, REQ-261, REQ-391
diff-similarityREQ-258, REQ-259
keymap-scopeREQ-131, REQ-194, REQ-256, REQ-257, REQ-447, REQ-448, REQ-451
rate-limit-oauthREQ-313, REQ-484
baseline-valueREQ-081, REQ-139, REQ-350
delta-baselineREQ-166, REQ-253, REQ-352, REQ-353, REQ-475
repeat-experimentREQ-025, REQ-350
token-budgetREQ-026, REQ-136, REQ-137, REQ-288, REQ-470
search-scoreREQ-291, REQ-307, REQ-393, REQ-416, REQ-419, REQ-421
history-restoreREQ-156, REQ-157
task-tickREQ-201
import-batchREQ-143, REQ-424
export-identityREQ-007, REQ-417, REQ-427, REQ-478
legal-deleteREQ-044, REQ-398, REQ-411
perf-percentileREQ-018, REQ-124, REQ-416, REQ-421, REQ-467
a11yREQ-017, REQ-441, REQ-453, REQ-479
metric-eventsREQ-034, REQ-035, REQ-036, REQ-037, REQ-038
ui-statesREQ-173, REQ-174, REQ-445

Phase 2 check

Every inventory row flagged as a PLAN section 2.2 conflict, or as a section 2.3 gap that changes behavior, cites an ADR from branch cursor/record-architecture-decisions-4859 (ADR-0001 through ADR-0034). gap:delta-baseline cites ADR-0026, which sets the baseline value those deltas and arrows use.

Phase 2 check: passed.

These section 2.3 flags do not change behavior, so the decisions index gives them no ADR:

FlagWhy it does not change behaviorRequirements
gap:legal-deleteArchive, do not delete, is already the rule. A legal-deletion path would be new scope.REQ-044, REQ-398, REQ-411
gap:perf-percentileThe limits stay as written: Inbox within 2 seconds, search under 100 ms, an agent flow under 10 seconds. Missing percentiles and a test environment do not change those limits.REQ-018, REQ-124, REQ-416, REQ-421, REQ-467
gap:metric-eventsSuccess metrics need measurement queries. Defining a query does not change product behavior.REQ-034, REQ-035, REQ-036, REQ-037, REQ-038
gap:ui-statesEmpty screens already teach in one line with one action, and loading states are already skeletons of the layout. That behavior is not limited to the Inbox.REQ-173, REQ-174, REQ-445