Referenced by18
Labels13

Referencing ideas

IdeaStatusTagsSummaryKatz
checkdone`reqlan check` should run perform the following checks: - ensure all rq [reference] point to real nodes, unless rq ignored with [comment_reference_ignore]. - this tests rqcomments point to real parts of the namespace, that code references exist, and that rq references exists. - report unresolved imports: [check_unresolved_imports]. - report a comment reference with invalid syntax: [code_comment_syntax_errors]. - report a qualified reference whose file is not on disk: [check_qualified_missing_file]. - report a qualified reference whose `.rq` file does not declare the idea: [check_qualified_missing_idea]. - it should really just be a wrapper of the [index] and return the issues ( as a pipe, terminal output, or json ). Issue order: [check_order_by_target]. Sparse wildcards: [check_wildcard_sparse] via flags [check_wildcard_zero] and [check_wildcard_one]. Path globs: [check_glob_patterns]. Skip missing targets: [check_skip_targets] [check_skip_gitignored_targets]. CLI: ["../cli/cli_package.rq".commands]. MCP: ["../extension/agent/skills-and-mcp.rq".mcp_check]. CI: [check_meta_implementation]. Site demo: ["../site/site.rq".broken_links_showcase].1.000
check_qualified_missing_ideadoneA qualified [reference] names a file and an idea. Example: `["../extension/index-host/graph-analysers.rq".not_an_idea]`. The same rule applies to a namespace alias: `[alias.idea]` ( [import_namespace] ). [check] reports an error when that file is an `.rq` file, the file does not declare the idea, and the file does not bind that name as an import alias. The issue kind is `references`. The label is the missing idea name. A path with no extension means `.rq` first ( [implicit_file_extension] ). A qualified reference to an idea that the `.rq` file declares is not this error. A qualified reference to an import alias bound in that file is not this error. A namespace import binds its `as` name. A from-import or qualified import binds its `as` name, or the idea name when `as` is absent. A from-import of an import alias stays [check_unresolved_imports]. The alias is not an idea. A qualified reference to a code file is not this error. That form uses [check_qualified_missing_file]. A missing file stays [check_qualified_missing_file]. [check] does not also report a missing idea for that file. [comment_reference_ignore] suppresses this error. Related: [check] [check_qualified_missing_file] ["../language/syntax.rq".reference_qualified]0.278
analytical_rust_portin-progressPort ["../core-architecture.rq".analytical_package] to Rust: lexer, parser ( index path ), extractor, SQLite index, search, and export. `@reqlan/analytical` remains the published JS facade ( `createAnalysisRuntime` / `AnalysisApi` / Zustand host state ). Native work lives in a `crates/` Cargo workspace and ships as per-architecture binaries per [distribution.rust_binary_distribution]. The editor language server is [lsp_rust.language_server_rust]. This analytical port does not replace that process. Component plans: [rust_crate_layout], [lexer_rust], [parser_rust], [parser_align], [indexer.indexer_rust], [search_rust], [export_rust], [native_bridge], [cutover].0.243
golden_corpusdoneParser / extractor alignment uses a frozen `.rq` tree under `testdata/golden-corpus/`, not live product requirements in `reqlan rq/`. Production idea lists may change without regenerating the dump. Copy a representative file into the corpus and refresh `crates/reqlan-index/tests/golden/langium-corpus-names.json` only when grammar or extract behaviour needs a new sample. Langium and Rust both extract name + kind from that tree and must match the committed dump. Live parse alignment ( elements and refs, both engines in one test ): [parser_align]. Comment character ranges on the same tree: [comment_span_align].0.104
parser_rustdoneRecursive-descent parser matching ["../../packages/language/src/reqlan.langium"] productions into a Rust AST the extractor can walk. Recovery: nameless `{...}` and local import mistakes still yield a usable document ( [parser_lexer.recovery_vs_budget] ). Wall-clock [parser_lexer.parse_budget_timeout] via native timeout / cancel — no Node worker process required on the index path. Open `.rq` buffers and CLI `parse` use `reqlan-parse` ( [lsp_rust.language_server_rust] ). Langium remains a dual-parser test oracle and the transitional `node` engine fallback — not the default editor LSP. Alignment contract: [parser_align].0.217
rust_crate_layoutdoneCargo workspace at repo-root `crates/` ( not inside `packages/analytical` ), crates: - `reqlan-parse` — lexer, parser, AST, recovery, parse budget - `reqlan-index` — extract, rusqlite store, mtime sync, diagnostics - `reqlan-search` — fuzzy / contextual / semantic ranking - `reqlan-export` — snapshot + html / md / json / csv writers; embed existing HTML JS assets - `reqlan-analytical` — facade matching `AnalysisApi` + `WorkspaceIndex` operations - `reqlan-napi` — Node binding for the core engine ( [native_bridge] ) - `reqlan-lsp` — editor language server ( [lsp_rust.language_server_rust] ) Mature crates only ( rusqlite, napi ): no experimental parser generators for the lexer. Golden tests compare Rust extract against Langium on the frozen [golden_corpus], plus the language-test fixtures ported into `reqlan-parse` / `reqlan-index` tests. Format: ["../development/commit.rq".rust_fmt]. Root `pnpm test` runs `test:js` then `test:rust` from ["../../package.json"]. `test:rust` is `cargo test --workspace --exclude reqlan-napi`. GitHub CI compiles crates once, then runs `cargo test` as its own step so crate tests reuse that build ( ["../distribution/distribution.rq".ci_gate] ).0.138
definitionThe indexer should live in the [core_analysis] module. On-disk schema: [sqlite_schema.ideas_index_sqlite] and [diagnostics_schema.diagnostics_sqlite]. Layout and WAL sidecars: [sidecars.reqlan_directory_layout]. Consumers: [consumers.index_consumers] ( extends [consumption] ). Sequencing and triggers: [sequencing.index_sequencing] ( extends [triggers] ). Cache reuse opportunities: [cache_reuse.index_cache_reuse].0.040
indexer_rustin-progressThe [index] engine ( parse-for-index → extract → SQLite persist → incremental sync ) should be written in Rust. Crate: `reqlan-index` over `reqlan-parse` per ["../core_analysis/rust_port.rq".rust_crate_layout]. Extractor ports ["../../crates/reqlan-index/src/extract.rs"] including [wildcard_reference_edges]. Store ports schema v4 ( ["../../packages/analytical/src/index-store/schema.ts"] ) via rusqlite; diagnostics live in `index-diagnostics.sqlite` on the same engine. Sync keeps [nonblocking_index]: per-file upsert, mtime skip, hard rebuild, cancellable progress. Not the Langium LSP. Comment-file indexing: [index_code_files].0.172
local_symbolic_analysisdoneOpen-file symbolic analysis must run in Rust on one file only. Input: file URI plus source text ( and optional import-root mappings ). Output: ideas in that file, import binding names in that file, outbound edges with UTF-8 source byte spans, and same-file inbound backlinks ( edges whose target is an idea declared in this file ). Import binding names let a qualified reference name an import alias ( ["../core_analysis/check.rq".check_qualified_missing_idea] ). LSP document-link and error underlines must convert those spans to UTF-16 ( ["../extension/language/syntax/features-syntax-highlighting.rq".reference_underline_syntax_align] ). Cross-file inbound still comes from SQLite via ["./cache-reuse.rq".unify_inbound_indexes]. Do not read SQLite. Do not walk other workspace documents. Do not load an idea catalog. The open-buffer model is ["../extension/language/support/open-file-sequencing.rq".ast_lifecycle]. The hot path parses this buffer once. It does not run this extract as a second parse. Import-target confirmation is a separate depth-1 parse ( ["../extension/language/support/open-file-sequencing.rq".outbound_one_hop] ). That parse is not this extract. The language server caches the open buffer by URI plus text fingerprint ( ["../extension/language/support/open-file-sequencing.rq".open_file_hot_path] ). Wildcard forms stay one `wildcard_reference` pattern edge ( unresolved ); sync still expands them later via [wildcard_reference_edges]. Flag: `ExtractOptions.local_symbolic` forces an empty candidate list. CLI: ["../cli/cli_package.rq".commands] `analyse --local-symbolic <file>`. Sidebar: ["../extension/local-context/activitybar-panels/current_context_scope.rq".reference_lists_pane] merges live same-file inbound / outbound with indexed refs ( [local_symbolic_sidebar] ). Related: ["../language/syntax.rq".open_file_reference_sequencing], [index], ["./cache-reuse.rq".unify_inbound_indexes].0.387
import_keywordsThe keywords import, from, and as are reserved for import statements. Import keywords may also appear as ordinary words in idea body text when not at statement start.0.047
import_namespaceNamespace import syntax uses import and a quoted path. Namespace import may include an alias using as. A bracket reference to the alias alone — for example `[context_model]` — opens the imported file and links only the alias name, like an ideaset namespace. Qualified references through the alias — for example `[context_model.builder]` — resolve ideas from the imported module. A qualified reference may also name an import alias bound in that module. Example: `[core_arch.analysis_runtime]` when `analysis_runtime` is an import alias in the imported file. That name is not an idea. Check does not report it as a missing idea ( ["../core_analysis/check.rq".check_qualified_missing_idea] ). A from-import of that alias is still a missing idea.0.179
code_snippetsIdea bodies and block attribute values may embed fenced code blocks delimited by triple backticks. An opening fence is three backticks as the first non-whitespace characters on a line, optionally followed by a language tag such as python or rq. A closing fence is three backticks as the first non-whitespace characters on a line. Three backticks in the middle of a line are prose. They do not open a fence. Everything between the fences is literal opaque text — it is not parsed as reqlan syntax. Keywords, imports, attributes, braces, and quotes inside a fence are inert for the parser and may be shown as examples without parse errors. Fenced blocks may span multiple lines and preserve their inner content verbatim. Brace-depth tracking must skip fence interiors so example braces cannot desync surrounding structure ( [no_name_idea_safe_warning] ). Related: ["../core_analysis/rust_port.rq".comment_span_align].0.113
file_suffixReqlan requirement documents use the. rq file suffix.0.052
inline_codedoneSingle-backtick spans ( `…` ) are opaque `INLINE_CODE`. They may show example syntax such as a quoted path plus idea. The grammar does not parse bracket or file references inside the span. Check and the language server must not report those examples as unresolved ["../reference_types.rq".file_reference] or idea refs. Related: [code_snippets], ["../core_analysis/rust_port.rq".comment_span_align].0.165
listsParenthesized lists contain newline-separated items. Each list item is either a one-liner or a nameless block idea in curly braces. Lists may appear as attribute values and inside block bodies. Named lists use a label followed by a parenthesized item list; the opening parenthesis must be followed by a newline before the first item. Nested lists may appear inside block values or as list items; the opening parenthesis must be followed by a newline before the first item. Inline parentheses in body prose — for example continuous ( " live " ) physics or ( pixelRatio 1, no WebGL ) — are plain text, not lists.0.055
markdown_linksdoneMarkdown `[label](target)` links are supported; the label is not treated as an idea reference. Example: testing requirements and the golden corpus. Related: ["../development/core.rq".testing], ["../core_analysis/rust_port.rq".golden_corpus].0.055
grammar_ruledoneGrammar rules describe the syntax features. Requirements: ["./language/syntax.rq"]; lexer bridge: ["./language/parser_lexer.rq".lexer_bridge_to_syntax]. Langium: [reqlan_grammar]; comment grammar: [comment_grammar]; index-path AST: [rust_ast].0.040
ideadoneA reqlan core unit is an idea. Syntax: ["./language/syntax.rq".simple_idea], ["./language/syntax.rq".block_idea]. Grammar: [reqlan_grammar] `Idea` / `OneLinerIdea`; index records: [analytical_types] `IdeaRecord`. Extract: [idea_extractor], [rust_extract]; AST: [rust_ast]. Product surface: [ideas_summary_tabs] Ideas tab per ["./extension/workspace-summary/ideas_summary/webview.rq".ontology_aligned_tabs].0.110

Reference labels

"../../crates/reqlan-index/tests/golden_corpus.rs:corpus_idea_names_match_langium_extract", "../../crates/reqlan-index/tests/golden_corpus.rs:mid_line_triple_backticks_keep_later_ideas", "../../crates/reqlan-index/tests/golden_corpus.rs:opaque_file_examples_do_not_extract_inline_or_fenced_paths", "../../crates/reqlan-index/tests/golden_corpus.rs:qualified_reference_to_an_import_alias_is_not_a_missing_idea", "../../crates/reqlan-index/tests/golden_corpus.rs:tutorials_rq_keeps_ideas_after_nested_slides_lists", "../crates/reqlan-index/tests/golden_corpus.rs:corpus_idea_names_match_langium_extract", ../../crates/reqlan-index/tests/golden_corpus.rs, ../../crates/reqlan-index/tests/golden_corpus.rs:corpus_idea_names_match_langium_extract, ../../crates/reqlan-index/tests/golden_corpus.rs:mid_line_triple_backticks_keep_later_ideas, ../../crates/reqlan-index/tests/golden_corpus.rs:opaque_file_examples_do_not_extract_inline_or_fenced_paths, ../../crates/reqlan-index/tests/golden_corpus.rs:qualified_reference_to_an_import_alias_is_not_a_missing_idea, ../../crates/reqlan-index/tests/golden_corpus.rs:tutorials_rq_keeps_ideas_after_nested_slides_lists, ../crates/reqlan-index/tests/golden_corpus.rs:corpus_idea_names_match_langium_extract