Cluster detail
status: done
Status cluster for done.
status
93 ideas
29 files
| Idea | File | Status | Summary |
|---|---|---|---|
| cli | reqlan rq/ai-support.rq | done | Headless twin of extension / MCP analysis: [cli_package] ( `reqlan` / `rq` ), same `<base>/.reqlan` index. [commands]: `init` · `parse <file>` · `analyse` / `analyze` · `search <query>` · `export` / `export html`. `--json` for machines; `--cwd` / `REQLAN_WORKSPACE`; `REQLAN_INDEX_PATH` overrides index dir. |
| skills | reqlan rq/ai-support.rq | done | rq- * skills ( [chat_skill_naming], [cursor_skills_install] ) teach the graph, not the whole repo. Ontology in one breath — this project as example: - [idea] — named unit of intent ( `cli_package`, `skills` ) - [file] / [ideaset] — containers ( `reqlan rq/cli/cli_package.rq`; file = implicit ideaset ) - [base] — `.reqlan` boundary; one ideas index per base - [reference] — `[idea]` / `[[wiki]]` / `["./path".idea]` to ideas and code - [attribute] / [attribute_body] — `@name …`; first unmarked text is the body Prefer focused search / file context / local graph over full dumps ( [ai_integration] ). |
| special_attributes | reqlan rq/ai-support.rq | done | When creating or updating ideas, skills MUST set: - `@status` — lifecycle ( `draft` | `pending` | `in-progress` | `done` | … ) - `@todo` — open gaps / follow-ups ( bare or with a note ) - `@tests` — quoted test paths that prove the idea ( optional `:test name` suffix ) Do not bury status, todos, or test links in body prose. |
| active_base_switch | reqlan rq/bases/base.rq | done | Changing the active base is a * * pointer swap * * onto a per-base `WorkspaceIndex` / store. - Do * * not * * await soft-sync, hard-rebuild, or a full `.rq` walk on the switch call itself. - Host surfaces rebind views to the newly active store ( status snapshot, tables, context panes ) immediately. - If the selected base is not yet ready, show its readiness / progress and * * schedule * * the normal activate catch-up ( open if needed, then one soft sync ) fire-and-forget — same path as ["../indexer/indexer.rq".triggers] / ["../extension/features-graph-analysers.rq".indexing_trigger_open], not a special switcher rebuild. - Idle staleness checks also heal unopened / never-synced bases ( they cannot mtime-diff without a store ). - `activateAll` isolates open failures so one bad base cannot leave siblings stranded in `uninitialized`. - Editor-follow must not overwrite a user pin on the same refresh that applies the selection. Surfaces: activity bar ["../extension/module/activitybar-panels/workspace.rq".workspace_base_picker], Ideas Summary ["../extension/module/ideas_summary/base-scope.rq".ideas_summary_base_scope]. Implemented by [editor_index_adapter] ( `setActiveBaseId` / `scheduleBaseCatchUp` ); engine: [base_registry] `ensureBaseReady`, [workspace_index] `ensureReady`. |
| function_parity | reqlan rq/cli/cli_package.rq | done | CLI shares headless function definitions with MCP and other tools through `@reqlan/analytical` `AnalysisApi`, not VS Code host APIs from [extension]. On-disk index storage follows [application_memory] ( same `.reqlan` path as the extension ); optional override via `REQLAN_INDEX_PATH`. |
| init | reqlan rq/cli/cli_package.rq | done | The cli should be able to initialise a new [base]. Creates `<path>/.reqlan/` ( empty directory is a valid marker ), matching [create_base_onboarding]. Headless helper lives in `@reqlan/analytical` so CLI and extension share one create-base path. |
| incremental_extension_build | reqlan rq/development/build.rq | done | Extension builds fingerprint inputs and outputs per independently cacheable artifact: - Langium generated sources / TextMate grammar - generated shared graph-physics source - logo media - generated marketplace README - each of the five Vite webviews separately - extension-host / language-server / lazy sql. js esbuild outputs A step is skipped only when its command / input fingerprint and current output-content fingerprint both match the cache under `packages/extension/out/`. Missing, changed, or manually edited output invalidates that step. Webview output fingerprints cover each complete emitted directory, including future lazy chunks. Host-bundle inputs include bundled phonebook data and the sql. js vendor source as well as workspace package output. TypeScript retains its native `tsc -b` project-reference incrementality. TextMate syntax copies are cached by content; Cursor-skill sync still runs because it targets workspace-external state. `pnpm run build:force` / `node scripts/build.mjs --force` bypasses all cache entries; `vscode:prepublish` uses this forced mode for release correctness. `clean` removes `out/`, including the cache, so clean builds remain cold. Root `pnpm run build:ext` delegates only to the extension package. The extension build generates Langium / physics artifacts when their fingerprints change, then its `tsc -b` builds language / analytical project references before downstream fingerprints are evaluated. It does not rebuild unrelated CLI, MCP, site, or test projects. |
| first_paint_startup | reqlan rq/extension/activation.rq | done | The activity-bar HTML shell is assigned synchronously by ["../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"]. Its Svelte app installs the host message listener before mount, then sends the one-shot `ready` handshake from a task queued after its first animation frame. ["../../packages/extension/src/extension/startup-gate.ts"] resolves that handshake once; `IndexService.activate` then discovers bases and syncs. If no view opens, a bounded three-second fallback starts the index without any visible first paint to contend with. Parser services inside each `WorkspaceIndex` are lazy and are created only when a file is actually parsed, not while bases are discovered. The sql. js asm implementation is emitted as a separate lazy vendor bundle, so loading `main.cjs` does not parse the database engine before `activate`. |
| configuration_rqignore | reqlan rq/extension/configuration.rq | done | Each base may define path ignore rules in `.reqlan/.rqignore` using * * gitignore syntax * *. Patterns are relative to the base root ( parent of `.reqlan` ), not the `.reqlan` directory. Owned by `@reqlan/analytical` so the CLI, MCP, and extension share one filter for discovery and indexing walks. Built-in defaults always apply ( dependencies, venvs, build output, VCS / editor stores, `*.db3` / sqlite DBs, `*.secret.rq`, hidden entries, and `.reqlan/` itself ); the on-disk file adds or overrides via the same syntax, including `!` negation. New bases seed `.reqlan/.rqignore` with those defaults ( ["./module/index.rq".rqignore] ). Missing or unreadable `.rqignore` still uses built-in defaults. Location convention: [configuration_location]. Application memory: ["./module/index.rq".application_memory]. |
| add_to_chat | reqlan rq/extension/features-commands.rq | done | A set of [command_palette] functions that add the selected idea, ideaset, or file to the chat. Commands: Add Idea to Chat, Add Ideaset to Chat, Add File to Chat ( category Reqlan ). Uses the idea / ideaset under the cursor ( or ideas overlapping the editor selection ) when in a. rq file; otherwise QuickPick. Opens chat with # requirement / # file context, with clipboard fallback. |
| open_index_diagnostics | reqlan rq/extension/features-commands.rq | done | Command palette action * * Open Index Diagnostics * * ( `reqlan.openIndexDiagnostics` ) opens the timing diagnostics webview for the active base. Shows total index time, run drill-down, and per-file ranking ( duration, depth, outcome ). Details: ["./features-index-diagnostics.rq".index_diagnostics_webview]. |
| search_code_actions | reqlan rq/extension/features-commands.rq | done | when cursor is in a [reference], there shouls be a code action to search for references to that idea. it should also allow wrapping a selected string, or the word at the cursor when in idea-body prose, as a new [reference]. it should open up a webview modal that shows a search dialog that allows the user to search for potential references. the search menu should preserve / show the context of the would-be reference: the rest of the containing idea, with styling, and with the selected text pulsing / styled prominently. it should support fuzzy / partial searching. it should list the closest matches in a paginated view. selecting the idea should fill / replace the reference ( or wrap the selection as [name] ) and an import ( if required ) appropiately |
| indexing_trigger_auto | reqlan rq/extension/features-graph-analysers.rq | done | When the editor host is idle, run a * * background staleness check * * — not a reindex and not a soft full sync UI pass. Philosophy: computationally cheap. Load document mtimes in * * one * * SQLite read, compare each file's FS mtime in memory, and only then index mismatched or new files; drop deleted docs in one batched delete. A single MAX ( mtime ) watermark is not sufficient ( one file can get newer while another gets older ). If nothing is stale: no state transition, no progress UI, no parse. If some files are stale: index * * only those files * * under ["../indexer/indexer.rq".nonblocking_index]. Schedule after a quiet period with no index activity; prefer running when the window is unfocused; defer or cancel if the user becomes active again. Extension host only ( [editor_index_adapter] ); CLI / MCP have no idle loop ( they sync on activate / command ). |
| html_export_graph_label_auto | reqlan rq/extension/features-html-export.rq | done | Export-surface wiring for [graph_label_auto]: canvas paint applies continuous zoom opacity ( GRAPH_LABEL_FADE_START → GRAPH_LABEL_FADE_END ); hover / drag stays fully opaque. Zoom and Fit from [html_export_graph_interaction] / [manual_reframe] update opacity each paint. |
| html_export_graph_label_modes | reqlan rq/extension/features-html-export.rq | done | Export-surface wiring for [graph_label_modes]: Labels control on every interactive export graph cycles auto / on / off; Reset restores auto. |
| html_export_header_link | reqlan rq/extension/features-html-export.rq | done | Html export should accept an optional header link ( href + label ) rendered in the topbar ahead of section navigation. Hosts such as the marketing site build can set this so readers can return to the parent site from any exported page. When omitted, the topbar shows only the export section nav. Site embed consumption: ["../../site/reqs/core.rq".spec_html_export]. Often paired with [html_export_url_base] when the export is mounted under a parent static site. |
| html_export_url_base | reqlan rq/extension/features-html-export.rq | done | Html export should accept an optional urlBase mount prefix ( for example `/spec` or `/reqlan/spec` ). When set, page and asset hrefs must be root-relative under that prefix so static hosts resolve correctly whether the directory URL includes a trailing slash. When omitted, exports keep document-relative hrefs suitable for local folder browsing. Applies across [html_export_internal_links] and [html_export_graph_links]; site embed consumption: ["../../site/reqs/core.rq".spec_html_export]. Often paired with [html_export_header_link] when the export is mounted under a parent static site. |
| index_diagnostics | reqlan rq/extension/features-index-diagnostics.rq | done | Indexing performance diagnostics: measure and inspect time spent indexing a [indexer.index] base. Timing is persisted in a dedicated * * diagnostic index * * under application memory ( [app_memory.index_diagnostics_store] ), not in `ideas-index.sqlite`, so history survives Clear & rebuild. Surfaces: [index_diagnostics_webview]. Owned by `@reqlan/analytical` for recording; the extension hosts the webview. |
| index_diagnostics_metrics | reqlan rq/extension/features-index-diagnostics.rq | done | For each sync / index run on a base, record: - wall-clock * * sum / total duration * * of the pass - * * file count * * ( visited ), skipped-by-mtime count, indexed ( parse / persist attempted ) count, error count - * * average path depth * * of visited files ( segments under the base root ) - per-file * * duration * * and outcome ( `mtime_skip` | `mtime_refresh` | `hash_skip` | `persisted` | `error` ) Runs are attributable to a trigger ( `soft_sync` | `rebuild` | `enqueue` | `stale` ). Instrumentation wraps [workspace_index] soft sync and [indexer.nonblocking_index] single-file paths via [diagnostics_store]. |
| index_diagnostics_webview | reqlan rq/extension/features-index-diagnostics.rq | done | An editor webview panel displays index timing diagnostics for the active base. Capabilities: - Base / latest-run summary: total time, file counts, average depth - Drill into recent runs - Rank files by duration ( slowest first ); show outcome and path depth Opened by command `reqlan.openIndexDiagnostics` ( [commands.open_index_diagnostics] ). Optional entry from workspace index health ( [workspace_pane.workspace_pane] ) may link later; command is the primary entry. Implementation: [diagnostics_panel], [DiagnosticsApp]. |
| welcome_webview_install | reqlan rq/extension/installation.rq | done | The * * Welcome to Reqlan * * onboarding webview is the extension-install UX surface. Opened once on first activation when `onboardingMessageShown` is false ( [welcome.installation_event] / [welcome.installation_event_trigger] / [welcome.onboarding_state] ). Content: welcome copy, resolved phonebook links, syntax-highlighted example `.rq`, open-as-untitled control, activity bar / `@reqlan` tips, sponsor thanks. Must not block [activation.activation_sequence]; errors are logged only. Reopen on demand via [welcome.show_onboarding_command] without resetting shown state unless product policy changes. Implementation: ["../../packages/extension/src/extension/open-thanks-for-installing.ts"], ["../../packages/extension/src/extension/onboarding-panel.ts"], ["../../packages/extension/webviews/onboarding/"]. |
| graph_label_auto | reqlan rq/extension/library/graph.rq | done | In Labels auto mode, visibility follows viewport zoom continuously rather than a hard cut. Below a low zoom threshold labels are fully hidden; above a slightly higher threshold they are fully opaque; between those thresholds opacity ramps briefly through a muted / semi-transparent phase ( GRAPH_LABEL_FADE_START → GRAPH_LABEL_FADE_END ). Hovered or dragged nodes remain fully opaque even when ambient auto opacity is low or zero. Zoom and Fit from [view_controls] / [reframe_view] must update this opacity on each paint or zoom event. Applies to Ideas Summary GraphCyController and HTML export canvas graph alike. |
| graph_label_modes | reqlan rq/extension/library/graph.rq | done | Every interactive graph should provide a Labels control that cycles auto ( default ), on, and off without changing graph membership. On forces full opacity; off hides all labels; auto follows [graph_label_auto]. Reset / default restore auto. Ideas Summary: control in ["../../../packages/extension/webviews/ideas-summary/components/GraphControls.svelte"], mode persisted via ["../module/ideas_summary/graphical_graph.rq".graph_ui_persistence]. HTML export: control in ["../../../packages/analytical/src/export/html-export-template.ts"] / ["../../../packages/analytical/src/export/html-export-assets.ts"]. Driven by the same viewport zoom as [view_controls]. |
| graph_labels | reqlan rq/extension/library/graph.rq | done | Graph node labels must show the full idea name without character truncation. Wrapping is allowed; ellipsis truncation of display names is not. Shared contract for Ideas Summary ( cytoscape ) and HTML export ( canvas ); surface-specific wiring lives under consumers. [graph_label_modes] [graph_label_auto] |
| graph_status_tag_filters | reqlan rq/extension/library/graph.rq | done | Status and tag graph filters are searchable checkbox dropdowns ( still a dropdown trigger; multi-select via checkboxes; OR within each field ). They must distinguish attribute absence from an empty declaration and from a literal unspecified value: - Not present — attribute key absent ( no `@status` / no `@tags` ) - Empty — attribute declared with no value ( `@status`, `@tags`, `@status ""`, bare flag ) - unspecified — literal authored value " unspecified " Do not invent unspecified for missing attributes in rollups, clusters, or filter options. Special options render differently from concrete values ( italic muted Not present; info-tint Empty; warning-tint unspecified ). Shared helpers live in ["../../../packages/analytical/src/core/filter-specials.ts"]. Surfaces: Ideas Summary SearchableCheckboxDropdown; HTML export SCD in ["../../../packages/analytical/src/export/html-export-assets.ts"]. |
| context_content_styling | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | Pane bodies must not grow unbounded. Nested lists use [NestedSection] ( collapse + scroll ) under [CollapsiblePane]. Priority: [scope_pane]; [reference_lists_pane] kind groups; also selection / parents. [ScopePane] [ReferenceListsPane] |
| dependency_pulse_table | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | The focus-hero [DependencyPulse] compass ( ↑ parents, → outbound, ← inbound, ↓ dependents, ● centre ) is clickable. Clicking any arm or the centre toggles a compact reference table below with Dir, Role, Idea, and Status. Rows open / focus the related idea. Duplicates of always-on inbound / outbound lists are omitted from the hero; the current-file lens still lists them. Aligns with [context_scope_v2.dependency_pulse]. Implemented by [DependencyPulse] [ScopePane]. |
| fingerprint_axis_drilldown | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | Each [ContextFingerprint] axis row ( Files, Requirements, History, Architecture, Git, Diagnostics, Coverage ) is clickable. Clicking a row toggles a compact contributor table below it ( Source, Item, Detail ) listing what filled that axis — e. g. which lenses included a file, which ideas are in the footprint, git focus commits / authors ( dirty paths secondary ), anomalies, or relationship edges. Table rows open / focus the related idea or file when actionable. Empty axes show a short “ why care / how to fill ” message. Mirrors the interaction pattern of [dependency_pulse_table]. Aligns with [context_scope_v2.context_fingerprint] and [tooltip_detail]. Implemented by [ContextFingerprint] [ScopePane]. |
| git_history_lens | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | Expanded git dimension in [scope_pane]: focus-centric development history, not a Source Control duplicate. Layout: - Header: branch name, HEAD short hash, muted summary ( e. g. " main · 3 commits · 2 authors " ). - Focus history ( primary ): up to ~ 8 commits touching the focus file / idea line range — relative time, short hash, subject, author. Prefer `git log -L` for `.rq` ideas; fall back to path log. Non-. rq uses path `--follow`. - Authors: compact chip row of top authors from that log window. - Working tree ( secondary, collapsed by default ): dirty staged / unstaged paths for caution / footprint only. Focus hero: history cue ( last commit age / branch ), not `git: staged|unstaged`. Fingerprint Git axis and drilldown list commits / authors ( dirty paths secondary ) per [fingerprint_axis_drilldown] and [tooltip_detail]. Aligns with ["../context-scope.rq".git_context] and [context_scope_v2.development_history_signals]. Implemented by [ScopePane] [ContextFingerprint]. |
| reference_resolution_parity | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | Reference resolution for the activity-bar references pane must use the same shared rules as the editor ( document links / go-to-definition ), not a second ad-hoc classifier. - Bare namespace-alias bracket refs such as `[ActivityBarApp]` that open a file in the editor must index as resolved `file_reference` edges ( import path ), not unresolved idea refs — per ["../../language/imports.rq".import_namespace]. - Quoted file paths and markdown file links use the same file-target treatment as the language file-link resolver in ["../../../../packages/language/src/reqlan-file-link-resolver.ts"] / ["../../../../packages/language/src/reqlan-namespace-import-links.ts"]. - File targets are opened relative to the defining `.rq` file ( same path join as the miniature graph ), not the workspace root. - If a target resolves in the file view, it must resolve ( and be openable ) in [reference_lists_pane]. Implemented by ["../../../../packages/analytical/src/index-store/idea-extractor.ts"], ["../../../../packages/analytical/src/core/file-reference-resolve.ts"], [ReferenceListsPane]. |
| tooltip_detail | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | Scope pane tooltips are detailed enough to explain * what * a meter means and * why it matters *. - [scope_pane] widgets ( stability, dependency pulse, timeline, churn, lens chips, footprint line ) expose granular hover copy on the control and its sub-items. - [ContextFingerprint] has an ⓘ info button with semantic scoring help, per-axis hover copy, and [fingerprint_axis_drilldown]. - Scoring copy is sourced from [context_signals] ( `CONTEXT_FINGERPRINT_HELP`, `CONTEXT_FINGERPRINT_AXIS_HELP`, `buildContextFingerprint` ) so UI stays aligned with [context_scope_v2.context_fingerprint] and [context_scope_v2.ai_readiness_gauge]. Implemented by [ContextFingerprint] [ScopePane]. |
| unresolved_reference_create | reqlan rq/extension/module/activitybar-panels/current_context_scope.rq | done | When an outbound reference remains unresolved after shared resolution ( missing idea, not a file / namespace-alias target ): - Do * * not * * treat the label as a file path or navigate to a non-existent file. - Show an unresolved badge and a * * + * * control with tooltip " Create idea ". - Activating * * + * * opens create-idea ( reuse [commands.pallete_function_create_todo] when available; until then, the existing import-error create-file flow prefilled with the reference name and source document ). Implemented by [ReferenceListsPane] and the activity-bar host message handler. |
| minigraph_file_reference_links | reqlan rq/extension/module/activitybar-panels/minigraph.rq | done | when the user clicks on a file reference link in the miniature graph, we should open the file in the editor if the file is defined as relative, it should be opened relative to the defining file, not the workspace root Fixed in [graph_analysers.local_graph_analysis]: external file nodes now resolve their path against the defining file's folder ( via the edge source id ) when the slice is built, so a workspace-relative path is handed to the editor open action. |
| workspace_base_picker | reqlan rq/extension/module/activitybar-panels/workspace.rq | done | Bases in the Workspace pane are chosen via a * * searchable dropdown * *, not a stacked list of base rows. - Closed: shows the active base label ( and compact ready / issue hint when useful ). - Open: type-to-filter over discovered bases by label and path; selecting a match * * pins * * the active base ( [bases.active_base_switch] ) — a pointer swap, not a sync. - Options surface label / path plus ready state and idea / edge / issue counts so the user can distinguish bases before committing. - Single-base workspaces still use the same control ( no special flat list ); empty discovery stays on the Create Base CTA. - Prefer VS Code dropdown tokens for chrome; keep the control compact so health / stats / actions remain the focus of the pane. Switch UX: - Selecting a base posts immediately; the picker may flash * * Switching … * * until `indexHealth` confirms `activeBaseId` ( should be near-instant ). - Never kick soft / hard sync on switch; readiness / progress for a not-yet-ready base is whatever the index already reports. - Editor-follow must not overwrite a user-selected base on the same refresh that applies the selection. Implemented by [BasePicker] in [WorkspacePane]; filter helpers in [filter_bases]. |
| workspace_content_styling | reqlan rq/extension/module/activitybar-panels/workspace.rq | done | Pane bodies must not grow unbounded. Nested lists use [NestedSection] ( collapse + scroll ) under [CollapsiblePane]. File → errors grouping via [group_file_issues] in [WorkspacePane]. |
| loading_state | reqlan rq/extension/module/activitybar.rq | done | After the activity bar shell mounts, the header may appear before pane data. Cover every sequencing beat with an explicit loading or error affordance — never a blank content area: 1. HTML shell ( before Svelte boots ): inline waiting markup in [get_activity_bar_html]. 2. Connecting: header visible; a post-first-frame `ready` handshake starts the index and requests the first host state. 3. Waiting for index: [workspace_panel.workspace_loading]. 4. Ready panes: [current_context_scope.context_panes_loading] and [minigraph.minigraph_loading]. Index sync progress belongs in [workspace_pane]; graph slice waits stay in [miniature_graph_pane], not a second global overlay. Host posts index health on `ready` and on subsequent status changes; soft-waits when the index is not ready instead of erroring the whole bar. |
| minigraph_file_reference_links | reqlan rq/extension/module/activitybar.rq | done | File-ref click open behaviour — details in [minigraph.minigraph_file_reference_links]. |
| panel_content_styling | reqlan rq/extension/module/activitybar.rq | done | Pane bodies must not grow unbounded. Nested lists use [NestedSection] ( collapse + scroll ) under [CollapsiblePane]. Details: [workspace_panel.workspace_content_styling], [current_context_scope.context_content_styling]. [WorkspacePane] [ScopePane] [ReferenceListsPane] |
| performance | reqlan rq/extension/module/activitybar.rq | done | Sidebar webviews share the same constraints as [graph_lib.webview_threading]. - The HTML / Svelte shell paints before index discovery begins; the post-paint `ready` handshake starts indexing. - Keep sql. js outside the activation-critical host bundle and load it only when a database opens. - Default neighbourhood slices; never load the full workspace graph into a pane. - Debounce editor selection and cursor events before rebuilding slices. - Lazy-mount cytoscape only for visible sub-panes; destroy when collapsed or hidden. - Reuse [graph_analysers.local_graph_analysis] and graph query builders rather than ad-hoc index walks in the webview. |
| context_model_layers | reqlan rq/extension/module/context-scope-v2.rq | done | Canonical v2 layers. Implementation builds on [context_scope_v1.reqlan_context_model]; consumers must not reconstruct project understanding independently. |
| context_signals | reqlan rq/extension/module/context-scope-v2.rq | done | Extracted facts. Answer: " What useful information exists? " One source may emit many signals ( e. g. git → development history, not only staged / unstaged ). Families: - [requirement_signals] - [file_signals] - [development_history_signals] - [project_activity_signals] - [semantic_signals] - [quality_signals] - [user_signals] - [relationship_signals] - [temporal_signals] - [risk_signals] - [architecture_signals] - [requirement_lifecycle_signals] - [base_signals] Signals are evidence; [synthesized_context] merges them into actionable knowledge. |
| synthesized_context | reqlan rq/extension/module/context-scope-v2.rq | done | Signals merged into decision-oriented knowledge not tied to a single source. Example projection on a requirement: - Importance, Confidence, Stability, Recent Activity - Dependencies, Implementations, Tests, Documentation - AI Risk Synthesis powers [show_dont_tell] widgets and [features_ai.ai_integration] exports — preference for compact synthesized facts over raw dimension dumps ( [context_scope_v1.ai_context_export] ). |
| ideas_summary_base_scope | reqlan rq/extension/module/ideas_summary/base-scope.rq | done | Ideas Summary is scoped to one ["bases".base] at a time. - Active base defaults to the longest-matching base root for the focused editor ( [bases.implied_context] ). - Chrome includes an explicit base switcher; Overview, Bases, Ideas, Ideasets, Attributes, References, Graph, Timeline, and Index tabs bind to the selected base's index only ( Bases lists all discovered bases; Index is last ). - Switching base is a pointer swap ( [bases.active_base_switch] ): pin via `setActiveBaseId`, rebind status / tables / graph UI immediately — do not await sync on the switch call; not-ready bases get fire-and-forget open + soft-sync catch-up. - Graph UI persistence is per-base: workspaceState key `reqlan.ideasSummary.graphUi.<baseId>` via [graph_ui_state]. - Activity bar " Open in Ideas Summary " passes the current active base id into [ideas_summary_panel]. - No merged cross-base tables or graphs in this pass ( [bases.multi_base_environment] ). |
| bases_tab | reqlan rq/extension/module/ideas_summary/webview.rq | done | Table of discovered [ontology.base] entries in the workspace ( label, path, ready, idea / edge / issue counts, state ). Selecting a row pins that base ( pointer swap ) per [ideas_summary_base.ideas_summary_base_scope]. Filterable / sortable / column options like other tables; data comes from index status, not a merged cross-base SQLite dump. Client-side search and column filters via [BasesTable] / bases-filter matcher. |
| ideas_table_filters | reqlan rq/extension/module/ideas_summary/webview.rq | done | the ideas table should support text search, column sorting, and attribute-column filters driven by chip clicks. attribute filters require a non-null attribute value in sqlite json per [webview_table_queries] reference chip filters match outbound / inbound edges by target or source id per [webview_table_queries] chips are right-aligned so truncated labels keep the informative suffix visible. active attribute and reference filters appear as removable chips in the table toolbar. Also [table_column_filters], [table_column_options], and [group_by_type]. |
| index_panel_base_support | reqlan rq/extension/module/ideas_summary/webview.rq | done | The [index_panel] / Ideas Summary chrome supports switching between bases in the workspace. Switch is a pointer swap per ["../../../bases/base.rq".active_base_switch] and ["./base-scope.rq".ideas_summary_base_scope] — rebind views, do not sync. |
| overview_coverage_scores | reqlan rq/extension/module/ideas_summary/webview.rq | done | Collapsible " Coverage " section on [overview_page] / [OverviewPanel]. Product-facing metrics for how thoroughly ideas map into the active base's project files ( respecting ["../../configuration.rq".configuration_rqignore] ): - Linked files: percent of project files ( non-requirement, non-ignored ) that ideas reference — exact path match after resolve, or under a referenced folder. Show " N of M project files ". - Requirement density: ideas per thousand lines of eligible project code; also show idea count and line count. - Linked paths: distinct files or folders referenced from ideas. - Requirement files: count of requirement documents in the base. Collapsed by default. Calculate only when the user expands the section ( not on Overview open / tab switch ). Non-blocking: host work must not stall Overview chrome or other tabs; show a loading state until the result arrives. When the index is not ready or calculation fails, show a clear message — never fake zero scores. Recalculate on expand when the active base changes or when the user refreshes; otherwise reuse the last result for the session. |
| table_column_filters | reqlan rq/extension/module/ideas_summary/webview.rq | done | Every data table supports a global search and a per-column filter row ( [ColumnFilterRow] ), matching the usability of [html_export.html_export_list_views]. Text / path / body columns use searchable inputs; closed sets ( idea kind, reference type, ideaset kind, base ready ) use select / multi-select from a fixed option list. Column filters are applied in the ui-sql layer ( [webview_table_queries] ) together with existing chip filters. Table panels must bind AppState query / rows via Svelte 5 `$derived` ( not legacy `$:` ) so filtered results from the extension message listener re-render — same pattern as [graphical_graph_doc.graphical_graph] / GraphView. Bases table filters client-side in the webview; other tables round-trip search through [ideas_summary_panel]. |
| timeline_page | reqlan rq/extension/module/ideas_summary/webview.rq | done | Timeline tab shows the evolution of ideas for the active base — not raw file-index noise. Sources: - Git idea lifecycle from indexed `git_created_at` / `git_modified_at` ( created + last edited as separate events when they differ ) - Session idea reindex activity ( one event per idea persisted, with name / status / summary when available ) Opening the tab backfills missing git dates via the `git_dates` analyser ( capped batch ) so the feed is useful without visiting every idea in the Activity Bar. Reindex must preserve existing git dates across upsert. Entries are reverse-chronological, filterable by source ( git / reindexed ), and clickable to open the idea. Each event surfaces idea-centric info: name, short summary, status, kind / tags, and path. Full live multi-commit git log browsing remains out of scope; this surfaces indexed idea history first. |
| application_memory | reqlan rq/extension/module/index.rq | done | Base-local application memory for reqlan tools lives under `<base>/.reqlan/`. The presence of `.reqlan` * * marks * * a directory as a ["../../bases/base.rq".base]; each base owns its own store. Shared by the VS Code extension, ["../../cli/cli_package.rq".cli_package], and MCP ( [mcp_server] ) — not VS Code `globalStorageUri` / extension-private storage. The ideas graph index ( ["../features-graph-analysers.rq".index_ideas] / ["../features-graph-analysers.rq".index_technology] ) persists as `ideas-index.sqlite` inside that directory. Index timing diagnostics persist separately as `index-diagnostics.sqlite` ( [index_diagnostics_store] / ["../features-index-diagnostics.rq".index_diagnostics] ) so rebuilds of the ideas index do not wipe history. Export form defaults ( all formats via ["../features-export.rq".export_webview], including HTML options in ["../features-html-export.rq".html_export_form] ) persist as `export_settings.json` in the same directory ( active base ). Path ignore rules live as `.rqignore` in the same directory ( [rqignore] / [configuration.configuration_rqignore] ). Path resolution is owned by [application_memory_impl] ( `resolveApplicationMemoryPath` ); consumers must use it ( or `REQLAN_INDEX_PATH` override for a single store ) so tools read and write the same store for a given base. Multi-base discovery / registry: ["../../bases/base.rq".multi_base_environment]. Index engine ownership: ["../../indexer/indexer.rq".ownership]. Extension wiring: [analytical_submodule]. Aligns with ["../../cli/cli_package.rq".function_parity]: shared analytical memory, not host-only state. |
| index_diagnostics_store | reqlan rq/extension/module/index.rq | done | Per-base diagnostic timing index at `<base>/.reqlan/index-diagnostics.sqlite`. Sibling of `ideas-index.sqlite`; not deleted by Clear & rebuild. Records sync runs and per-file durations for ["../features-index-diagnostics.rq".index_diagnostics_metrics]. Webview: ["../features-index-diagnostics.rq".index_diagnostics_webview]. |
| rqignore | reqlan rq/extension/module/index.rq | done | `.reqlan/.rqignore` filters which paths discovery and indexing crawl, using gitignore syntax relative to the base root. Owned by [rqignore_impl] in `@reqlan/analytical` so CLI and editor share behaviour. Defaults cover `node_modules/`, virtualenvs, build dirs, VCS / editor stores, database files ( `*.db3`, sqlite ), secrets, and hidden entries; new bases seed the file via create-base. Product configuration statement: [configuration.configuration_rqignore]. |
| installation_event | reqlan rq/extension/onboarding/page-thanks-for-installing.rq | done | On installation of the extension a webview should be opened showing: - A welcome message - Resolved links to site, github, docs etc. ( not template placeholders ) - A syntax-highlighted example `.rq` with real URLs ( clickable ) from ["../../packages/extension/templates/thanks-for-installing.template.rq"] after placeholder substitution - A control to open that example as an untitled `.rq` editor beside the webview - Short tips for the activity bar and `@reqlan` chat - A thanks to sponsors Place in overall install sequencing: ["../installation.rq".welcome_webview_install] / ["../installation.rq".extension_installation]. Implemented as a Svelte webview under ["../../packages/extension/webviews/onboarding/"] bundled to ["../../packages/extension/media/webviews/onboarding/"] and opened once on first activation by ["../../packages/extension/src/extension/open-thanks-for-installing.ts"] via ["../../packages/extension/src/extension/onboarding-panel.ts"]. Resource links and template values are resolved at runtime from [phonebook_reqs.phonebook] through ["../../packages/extension/src/shared/phonebook.ts"] and posted to the webview; the example block imports ["../../packages/extension/templates/thanks-for-installing.template.rq"] via Vite `?raw` and substitutes `{{…}}` placeholders before display. Highlighting uses the onboarding tokenizer in ["../../packages/extension/webviews/onboarding/lib/rq-highlight.ts"]. The source template still uses placeholders such as { { SITE_URL } }; those matching braces are body prose per ["../language/syntax-edge-cases.rq".nested_curly_braces] and must parse without errors. Activation state is stored in extension global state key `onboarding` with `onboardingMessageShown` and `lastVersion` per ["../../packages/extension/src/extension/onboarding-state.ts"]. VS Code persists `globalState` in the extension global storage directory ( `globalStorage/reqlan.reqlan-extension/state.vscdb` under the editor user data folder ). |
| installation_event_trigger | reqlan rq/extension/onboarding/page-thanks-for-installing.rq | done | The installation event should be checked and triggered at extension [activation.activation]. Verified: ["../../packages/extension/src/extension/main.ts"] calls `openThanksForInstallingIfNeeded` at the end of `activate`, and [activation.onboarding_check] documents the gating behaviour. |
| show_onboarding_command | reqlan rq/extension/onboarding/page-thanks-for-installing.rq | done | A [command_palette] action should reopen the onboarding webview on demand. Command: Show Onboarding ( category Reqlan, id `reqlan.showOnboarding` ). Implemented by ["../../packages/extension/src/extension/register-onboarding-commands.ts"] calling [open_onboarding_page]. Does not reset [onboarding_state]. |
| deferred_startup_sequence | reqlan rq/extension/startup-performance.rq | done | Required order: 1. Load the smallest practical host entry. 2. Synchronously register commands and the activity-bar provider; return from `activate`. 3. Assign the activity-bar shell and wait for the post-first-frame `ready` handshake. 4. Start index discovery / sync after `ready`; if the sidebar stays closed, start after a bounded three-second fallback so startup indexing and watchers are not lost. 5. Start the language client after `ready`, with a one-second fallback so language features work when the sidebar stays closed. 6. Report incremental index progress inside the already-painted sidebar. The ready signal and both startup paths are one-shot / idempotent. [activation.background_startup] |
| development_bundle_freshness | reqlan rq/extension/startup-performance.rq | done | F5 executes `package.json.main` ( `out/extension/main.cjs` ), not TypeScript source. `out/`, generated webview media, and copied syntaxes are gitignored, so launching without a build can run missing or stale artifacts even when source already contains the fix. `.vscode/launch.json` therefore uses a deterministic pre-launch task that invokes the extension build orchestrator directly; root `pnpm run build:ext` delegates to the same script. The task content-fingerprints Langium and physics generation, each webview, packaging media, and extension-host / language-server output; `tsc -b` retains project-reference incrementality. Unchanged artifacts are verified and skipped before the development host opens. Watch mode remains useful during iteration, but concurrent watchers do not restart an already-running extension host or language-server child; stop and start F5 after host / server changes. ["../../.vscode/launch.json"] ["../../.vscode/tasks.json"] |
| extension_startup_reliability | reqlan rq/extension/startup-performance.rq | done | Reqlan startup must make the activity-bar shell and contributed commands available before optional indexing, parser construction, database initialization, or language-client startup can monopolize the extension host. The implementation contract is [first_paint_contract], [deferred_startup_sequence], [lazy_runtime_dependencies], and [development_bundle_freshness]. Operational diagnosis follows [startup_diagnostics]. [activation.activation_sequence] [activitybar.loading_state] [indexer.nonblocking_index] [build.extension_bundle] |
| first_paint_contract | reqlan rq/extension/startup-performance.rq | done | The platform spinner ends only after VS Code loads the host module, calls `activate`, the provider registers, and `resolveWebviewView` assigns HTML. Reqlan assigns the lightweight HTML / Svelte shell first. The webview installs its host message listener, mounts, waits for its first animation frame, then posts the one-shot `ready` signal from a queued task. Index discovery / sync waits for that post-paint signal so synchronous parser or database setup cannot race the first visible frame. [activation.first_paint_startup] ["../../packages/extension/webviews/activity-bar/App.svelte"] ["../../packages/extension/webviews/activity-bar/state/app.svelte.ts"] ["../../packages/extension/src/extension/startup-gate.ts"] |
| invalid_url_activation_failure | reqlan rq/extension/startup-performance.rq | done | The concrete incident failed while requiring `out/extension/main.cjs`, before `activate()` ran: `TypeError: Invalid URL` in `embedPhysicsCoreSource`. Runtime `readFileSync(new URL(..., import.meta.url))` is unsafe when esbuild emits CommonJS for an ES2017 target: `import.meta.url` is unavailable / empty and source-relative assets do not exist beside the bundled entry. The fix generates and imports `PHYSICS_CORE_CLASSIC_SOURCE` at build time instead of resolving the source file at extension runtime. ["../../packages/analytical/src/export/html-export-assets.ts"] ["../../packages/analytical/scripts/generate-physics-core-source.mjs"] |
| lazy_runtime_dependencies | reqlan rq/extension/startup-performance.rq | done | Base discovery must be cheap: - Constructing `WorkspaceIndex` does not construct Langium / Chevrotain services; services are memoized on first parse. - sql. js asm is not parsed as part of `main.cjs`; both index stores dynamically import the generated vendor bundle when a database first opens. - Export / physics source is generated at build time rather than read via extension-runtime URLs. The host bundle consequently fell from approximately 11. 2 MB to 2. 66 MB; sql. js occupies a separate approximately 8. 0 MB lazy vendor bundle. ["../../packages/analytical/src/index-store/workspace-index.ts"] ["../../packages/analytical/src/index-store/sqlite-store.ts"] ["../../packages/analytical/src/index-store/index-diagnostics-store.ts"] ["../../packages/extension/esbuild.mjs"] |
| verification_contract | reqlan rq/extension/startup-performance.rq | done | Startup changes are complete only when: - The production extension build succeeds and emits both `out/extension/main.cjs` and `out/extension/vendor/sql-asm.cjs`. - The main bundle does not contain the sql. js asm implementation and imports the vendor lazily. - The lazy vendor can initialize a database. - Extension startup-gate and analytical lazy-service tests pass. - Activity-bar shell paint is visually checked in a newly restarted F5 development host; activation failures are cached for the lifetime of a failed host session. - Requirement analysis resolves the updated startup graph. |
| code_lens_reference_types | reqlan rq/extension/syntax/features-syntax-highlighting.rq | done | References should have a ["../vsc-primitives.rq".codelens] button. The button should be togleable in settings. The button should the classification of the reference. e. g. ' open reqlan file', " open { extension } file', ' open folder', ' open idea' Clicking the CodeLens should open a reference card with summary stats — not navigate, because references already act as editor links. The card should offer open / reveal / file-selector actions when useful. Folders should be handled by focusing on the ide explorer, or by opening a file selector. Some summary stats should be shown for references - e. g. last edited, count of references, count of referencers, etc. Implemented by ["../../../packages/language/src/reqlan-code-lens-provider.ts"], ["../../../packages/language/src/reqlan-reference-code-lens.ts"], ["../../../packages/language/src/reqlan-code-lens-settings.ts"], ["../../../packages/extension/src/extension/register-reference-code-lens.ts"], and ["../../../packages/extension/src/extension/reference-code-lens-card.ts"]. |
| inbound_inlay_hints_whole_graph | reqlan rq/extension/syntax/features-syntax-highlighting.rq | done | Inbound references shown in [view_references_as_inlay_hints] should include referencers from the whole requirement graph across the workspace, not only ideas declared in the current file. Implemented by ["../../../packages/language/src/reqlan-inbound-reference-inlay-label.ts"], ["../../../packages/language/src/reqlan-inlay-hint-provider.ts"]. [view_references_as_inlay_hints] [traceable_inlay_hints] |
| traceable_inlay_hints | reqlan rq/extension/syntax/features-syntax-highlighting.rq | done | Inlay hints should be traceable, i. e. if a user clicks a specific idea reference, it should open that idea, if a user clicks the all references hint, it should open a search webview with the idea preselected / targets prefiltered Implemented by ["../../../packages/language/src/reqlan-inbound-reference-inlay-label.ts"], ["../../../packages/language/src/reqlan-inlay-hint-provider.ts"], and ["../../../packages/extension/src/webview_module/register-webview.ts"]. |
| nonblocking_index | reqlan rq/indexer/indexer.rq | done | Index sync must stay non-blocking for the host UI ( notably [activity_bar_doc.activity_bar] and [workspace_pane_doc.workspace_loading] ). Editor startup is gated by ["../extension/activation.rq".first_paint_startup]; discovering a base must not construct Langium services, which are initialized lazily on the first parse. While syncing, surface progress — state, processed / total, and the current file — in [workspace_pane_doc.workspace_pane] and [ideas_summary_doc.index_panel]. In-flight sync must be cancellable from those surfaces; cancel keeps already-indexed rows and returns the index to ready. Incremental behaviour ( see also [graph_analysers.indexing_incrementality] ): - Single-file create / change / delete via watchers indexes only that file — never a full base walk. - Soft full sync ( `syncWorkspace` / Refresh ) skips parse + persist when the file's mtime matches the value stored on the documents row. - Hard refresh ( `clearAndRebuildIndex` / Clear & rebuild ) wipes the store and reindexes every file. Implemented by [workspace_index]; editor adapter [editor_index_adapter]. |
| parse_budget_timeout | reqlan rq/language/parser_lexer.rq | done | Lexing, parsing, or a parse subprocess for a single `.rq` file must finish within a wall-clock budget. If it cannot, do not hang the language server or block the rest of the workspace. Surface both a warning ( budget exceeded; semantic features may be incomplete ) and an error ( file left unloaded ) on that document, then continue with other files. Happy path stays in-process ( sync ) for typical file sizes so edits and workspace load stay fast. Killable worker enforcement is used when the input is large, a file previously hit the budget ( sticky escalate ), or a caller forces the worker path; sync throws still become the same incomplete result shape. |
| context_sensitive_lexer_scaling | reqlan rq/language/syntax-edge-cases.rq | done | Context-sensitive token classification for structural / prose braces and top-level import keywords must remain linear in document size. The lexer records brace-depth changes sparsely ( not per-character tables ) and looks them up in log time while tokenising, so workspace language-server initialization and editor re-lexes stay bounded. Code fences are skipped during the brace scan so example braces cannot inflate work or desync depth. Bounded work still assumes the lexer / parser * returns *; unbounded hangs are cut by ["./parser_lexer.rq".parse_budget_timeout]. |
| no_name_idea_safe_warning | reqlan rq/language/syntax.rq | done | A top-level nameless curly-brace block — `{... }` with no idea name — must not take down the parser or the language server workspace. Parse the block as a recoverable anonymous top-level element, emit a descriptive warning that a name is required before `{`, and continue so later ideas, imports, and links still work. Nameless blocks inside parenthesized lists remain valid list items per [lists]; only top-level nameless blocks warn. Related recovery posture: ["./imports.rq".import_error_recovery]. Block shape: [block_idea]. Fenced examples must stay opaque per [code_snippets] so braces inside snippets cannot desync structural depth. Non-termination ( lex / parse never finishes ) is a different failure mode: ["./parser_lexer.rq".parse_budget_timeout]. |
| presentation_player_route | site/reqs/core.rq | done | `/presentations/player/` is a statically exported Next page that loads runtime deck JSON from `/presentations/decks/` and Reveal from `/presentations/vendor/reveal.js/`. Runtime JSON is generated from authored JSONC by [sync_presentations]. It must not use SiteShell; it is iframe-hosted by tutorial detail pages. Do not place `public/presentations/player/index.html` — that path is owned by the App Router export. |
| spec_html_export | site/reqs/core.rq | done | The site static build exports the workspace requirement graph ( excluding `*.secret.rq` ) under `out/spec/` via `reqlan export`. It must pass [html_export.html_export_url_base] for `/spec` ( honouring `SITE_BASE_PATH`, e. g. `/reqlan/spec` in production ) so `/spec` loads with or without a trailing slash. It must pass [html_export.html_export_header_link] pointing at the marketing site home so readers can leave the embedded spec and return to the parent site. Pipeline: ["../scripts/build-static.mts"] → ["../scripts/export-spec.mts"] → ["../scripts/verify-static-export.mts"]. Host options come from [html_export.html_export] / CLI [cli_package.commands]. |
| sync_presentations | site/reqs/core.rq | done | `scripts/sync-presentations.mts` reads authored `*.jsonc` decks and `manifest.jsonc`, emits comment-free `*.json` for the static player, and syncs assets / vendor into `public/presentations/`. |
| tutorial_location_crumb | site/reqs/core.rq | done | Tutorial detail chrome shows a compact location trail: catalog → course → lesson → slide. Hierarchy must be obvious without a wide single-line title dump. Layout: each tier is a stacked chip — role ( and optional completion control ) on the top row; title / index value muted underneath. Titles colour up on hover, focus-within, or when the peer menu is open. * * Folder navigation: * * each tier acts like a path segment / folder. Hover or focus reveals a peer menu for that level of the tree so the user can jump without using the transport row: - catalog → courses ( enter first lesson of the chosen course, or the catalog index ) - course → peer courses - lesson → peer lessons in the active course - slide → peer slides in the active lesson ( updates the embedded player / `?slide=` ) Current peer is marked; menus stay keyboard-reachable via focus-within. * * Sizing: * * the crumb container grows to fit text; wrap before truncating. Ellipsis only as a last resort on very narrow viewports — do not cap chip width so aggressively that titles ellipsize while space remains. Course deep-links also exist at `/tutorials/#course-<series>`; catalog at `/tutorials/`. Slide shows `n/total` and updates live with the embedded player. Completion toggles stay on the role row. The crumb lesson tier always shows the * * current * * lesson only — it must not share hover / preview state with the transport lesson step dots. Step-dot hover may preview a title near the dots, never in the crumb. |
| tutorials_section | site/reqs/core.rq | done | The site exposes `/tutorials` and `/tutorials/[slug]/` as statically generated pages. Catalog and deck ids come from authored ["../../presentations/manifest.jsonc"]. Each detail page embeds the Reveal player iframe at `/presentations/player/?deck=<id>` using [assets] / SITE_BASE_PATH-aware `sitePath`. Each detail page hosts a unified transport chrome ( `<<` `<` steps `>` `>>` ) that drives slide nav in the embedded player via postMessage, plus lesson jumps. Location hierarchy chrome: [tutorial_location_crumb]. Blurb and try-this live on the catalog and inside the slides, not as page chrome. The player is an App Router page ( [presentation_player_route] ) so it static-exports under `trailingSlash` without colliding with `public/` HTML. Sync ( [sync_presentations] ) converts authored deck / catalog JSONC under ["../../presentations/"] into runtime JSON under `public/presentations/`, and copies assets plus vendored Reveal. js ( player shell excluded ). |
| agent_context_showcase | site/reqs/showcase.rq | done | Flagship. Context for the agent, not the repo. An agent answers a question about session expiry. Show the repo-dump cost, then MCP file_context returning six ideas and their edges, then the plan the agent writes. Absorbs former agentic-planning and feature-tracking pages. |
| antipatterns_showcase | site/reqs/showcase.rq | done | Depth. Three ways to write. rq badly. Data instead of pointers, prose restating code, one monolithic file. Showing negative space is a taste signal. Absorbs former data-not-ideas page; expands it. |
| attribute_dialect_showcase | site/reqs/showcase.rq | done | Depth. Attributes as a domain dialect. The full attribute grammar: flags, negated flags, block values, nested and named lists — forms nobody currently knows about. Absorbs former arbitrary-attributes page. |
| audit_trail_showcase | site/reqs/showcase.rq | done | Depth. An audit trail you can export. Custom clause / evidence / verified_by attributes, then Completion Status showing the coverage gap, then HTML export as the auditor's deliverable. Domain: regulated software — IEC 62304 or SOC 2. Absorbs former compliance page. |
| broken_links_showcase | site/reqs/showcase.rq | done | Flagship. Links that break loudly. Someone renames a file. Show the diagnostic, the quick-fix menu, and the rewritten refs. This is the argument against a wiki. Domain: refactor safety, any stack. |
| firmware_cloud_contract_showcase | site/reqs/showcase.rq | done | Flagship. The contract between firmware and cloud. A 10 Hz sample rate and a 50 ms ingest deadline: one invariant, two codebases, neither of which can express it alone. Absorbs half of former glue-semantics and static-connection. |
| graph_view_showcase | site/reqs/showcase.rq | done | Depth. See the whole graph. Needs real captured screenshots or a short loop from the actual Cytoscape view — not fake ASCII arrows dressed as. rq. Aligns with [diagrams_are_never_dressed_as_code]. |
| interlock_showcase | site/reqs/showcase.rq | done | Flagship. The interlock that must not fail. A safety requirement bound to ["./plc/interlock.stL#41-58"] by symbol and line range, to a vitest case by test name, with an rq-comment in the ST source pointing back. Domain: industrial control / IEC 61131. |
| legacy_archaeology_showcase | site/reqs/showcase.rq | done | Depth. Archaeology on inherited code. An undocumented function, an rq-comment seeded into it, @ deprecated on the old path, then Deprecation Impact listing everything that breaks. Absorbs former scattered-docs page. |
| module_surface_showcase | site/reqs/showcase.rq | done | Depth. A module's published surface. billing / interface. rq exports an ideaset; checkout. rq imports only that; reaching past the boundary is an unresolved-import error. Ideasets-as-public-API is undemonstrated today. Absorbs half of former glue-semantics and module-interface. |
| phase_1_parse_gate | site/reqs/showcase.rq | done | Make dishonesty impossible. Add a build step that runs the Langium parser over every language- " rq " block in showcases. ts and fails on parse errors or unresolved local refs. Do this first so the rewrite cannot reintroduce the current problem. Also expand Shiki language set per [showcase_languages]. |
| phase_2_content_schema | site/reqs/showcase.rq | done | Extend ShowcaseBlock union and Showcase type per [showcase_module]. Presentation polish can follow in [phase_5_detail_layout]; schema first. |
| phase_3_reqs_as_truth | site/reqs/showcase.rq | done | This file is the source of truth: one idea per showcase with mechanism, domain, and status; [showcase_set] listing them; refs into showcases. ts. Reqlan's own showcase plan is tracked in reqlan. |
| phase_4_write_the_eleven | site/reqs/showcase.rq | done | Write the eleven, one at a time, each validated by [phase_1_parse_gate] before moving on. Flagships first — [agent_context_showcase], [interlock_showcase], [broken_links_showcase], [firmware_cloud_contract_showcase] — so the format can be judged before committing to all eleven. |
| phase_5_detail_layout | site/reqs/showcase.rq | done | Detail page layout: beats with captions, mechanism badges distinct from tags, and cross-block highlighting of the shared identifier. |
| phase_6_capture_media | site/reqs/showcase.rq | done | Capture real media from the extension for [broken_links_showcase] ( diagnostics / quick-fix ) and [graph_view_showcase] ( Cytoscape ). |
| showcase | site/reqs/showcase.rq | done | Every showcase demonstrates a mechanism, not a metaphor. Domain problem, the. rq that binds it, the real artifact in another language it binds to, and the thing the tooling hands back. Content is authored in TS objects per [showcase_module], not generated from this file at runtime. This file is the source of truth for intent, ordering, and editorial rules. |
| showcase_module | site/reqs/showcase.rq | done | Showcases are standardised and typed in TS content objects. Short version ( list card ): id, title, summary, tags, mechanism badge. Long version ( detail page ): full blocks array including payoff. Exist as a list page and as a full page per slug. Routes: / showcase / and / showcase / [slug] / — static export. Block kinds needed beyond today's code | features union: callout — the one-sentence point of the page exchange — query + response, terminal-styled diagnostic — editor-style error with quick-fixes diagram — visually distinct from code; never language- " rq " caption / mechanism fields on the showcase object Copy stays minimal and show-don ' t-tell, aligned with site copy rules. |
| test_proves_showcase | site/reqs/showcase.rq | done | Depth. What this test actually proves. Keep the intent of the former test-explanation page; upgrade it with a real test-name anchor and the reverse direction from test file back to intent. |
Initialising graph…