Skip to content

Name sections by path and add the markdown namespace - #210

Merged
vinniefalco merged 9 commits into
cppalliance:masterfrom
vinniefalco:master
Nov 12, 2026
Merged

vinniefalco merged 9 commits into
cppalliance:masterfrom
vinniefalco:master

Conversation

@vinniefalco

@vinniefalco vinniefalco commented Nov 12, 2026 •

Copy link
Copy Markdown
Member

Every function that names a section now takes a section path, the prompt reads can pick one block of a section, and a new markdown global parses any Markdown text into plain Lua tables. This implements Section Paths, the markdown Namespace, and the prompt Reads. Nine commits, 212 files.

It is a language change. Every prompt in this repository is rewritten in it, and the address form with # markers, prompt.list, and list sections are removed with nothing left behind that recognizes them.

What an author sees:

  • A section is named by a path of titles. call('Worker') names a child, jump('../Review') names a sibling, and /Library/Template names any section from the top. The heading level is not part of the address, so moving a section to another depth changes no path.
  • call, jump, tasks.spawn, and tasks.fanout take the two relative forms, which are the visible set. prompt.section and prompt.section_or take those and a path from the top. require takes only a path from the top, so a library has one spelling at every depth.
  • The not-found error says where the lookup looked and lists no other section: section `../Kid` not found: `/Main` has no sibling `Kid` .
  • prompt.section raises when its section is not there, and prompt.section_or returns nil.
  • prompt.section(path, selector, n?) reads one block of a section, as in prompt.section('Template', 'fence markdown').text and prompt.section('Topics', 'list').items.
  • A relative path in a library's code starts at the library section, so a library can keep its own templates and workers. jump and _G stay with the section that is running.
  • markdown.parse, markdown.section, markdown.section_or, markdown.select, and markdown.render work over any text, with paths such as /Guide/Setup, //title, and title[n].
  • Every parsed block holds source, the exact lines it was read from. markdown.render writes sources, so a parse is written back as the text it came from, and the selector * gives a document as one flat list.

The commits, in order:

  • Add the runvil-markdown crate. A new internal crate, crates/runvil-internal/markdown, reads Markdown into a tree of plain blocks and writes blocks back. The parser is three layers of nested modules: the pulldown-cmark events, a flat list of blocks, and the folded tree. The crate also holds the path grammar and the selector grammar, which prompt paths and markdown paths share. It reads Markdown with the options the prompt parser uses and reads frontmatter with serde_yaml_ng, so it adds no dependency to the workspace. It lands first so that there is one path grammar from the start.
  • Name every section by a section path. One resolver, runtime/src/section_path.rs, serves every function that names a section. The library-load events and the cycle error print a library by its path from the top. Every prompt, test prompt, and test is rewritten.
  • Make prompt.section raise on a miss and add prompt.section_or.
  • Resolve a library's relative paths from the library. require loads each library block with an environment of its own, which holds a call, a prompt, and a tasks bound to the library.
  • Add the markdown global. The lookups walk Lua tables without calling into Lua, read through var views, and count their work against the VM's budget.
  • Read one block of a section with prompt.section.
  • Remove prompt.list and list sections. ErrorCode::ListEmptyItem, number 104, is removed, and the number is left unused. That is the one change to the two public-api.txt listings. The Workshop server's parse_list code goes with it.
  • Call a jump target a path where the code still said heading.
  • Keep each block's source so markdown.render gives back the text. The writer of the first commit rebuilt each block in one fixed style, so rendering a parse renumbered lists, rewrote markers and fences, and dropped a title's markup. Every block now holds source: its own lines and the blank lines after them. The sources of a parse are the whole text, and markdown.render writes them and nothing else. This also removes the fence that a review found the old writer broke. plan/2026-11-12-1-exact-markdown-source.plan.md holds the design and what the build found.

What changes for a prompt written before this:

  • Every section reference is rewritten as a path. A string such as '## Rules' is now an ordinary name that matches nothing.
  • prompt.list(x) becomes prompt.section(x, 'list').items.
  • A read of a section that is not there raises. prompt.section_or is the read that returns nil.
  • A library function that named a section of its user now names the library's own. _G.call and _G.prompt name the user's.
  • A nested bullet is part of its parent's item, and a bullet with no content is the item "" where it failed the parse.

Checked locally on Windows: cargo fmt, clippy with warnings denied, cargo nextest with 4303 tests, the build-xtask tests, rustdoc with warnings denied, dylint, cargo xtask api --check, and the docs-claims test.

Pushed alongside this:

The design in `runvil-design/design/2026-11-11-1-markdown-and-prompt-reads.md` names every section by a section path and reads Markdown as plain blocks. This crate is the part of that design that needs no Lua: the text-to-blocks parser, the path and selector grammars, and the writer behind `markdown.render`. Nothing uses it yet. It lands first because the functions that name a section in a prompt take the same path grammar.

- `parse` reads any text into `Block`s and never fails. It works in three layers under `parse`: `events` runs `pulldown-cmark` and records each top-level heading, fence, list, and rule by its byte range, `flat` turns those marks into blocks in file order with the text between them as prose, and `tree` folds them into sections. Only `events` names the library, and only `flat` sees a byte range. `frontmatter` splits the YAML mapping off first, by the prompt parser's delimiter rule, and `serde_yaml_ng` reads it.
- `parse_body` is the same parse for text with no frontmatter, with lines counted from a given line, which is what a read of one section's own content needs.
- `split` is the one path grammar: steps, the three escapes, the trimming, and what makes an index. `Path` is the form over parsed text. `Selector` reads a kind or `fence` and a language, and `nth` is how an index counts.
- `render` writes every list of blocks and checks nothing. What can be read back is for its caller to check, which knows where each block came from.
- The grammars return their message as a `String`, because each caller puts its own function's name in front before it raises the universal `Error`. So the crate depends on no workspace crate.
- Where the design is silent: an index too large for an `i64` is kept as the largest one, which no match reaches; a path that ends in a backslash raises `ends in a backslash`; and `fence` followed by two words raises `a fence selector takes one language`.
- The tests hold the design's worked example, each row of its edge-case table, and two properties over 74 sample texts: every non-blank line lies in exactly one block, and parsed text is written as text that parses to the same blocks.
Every function that names a section now takes a path of titles, as `runvil-design/design/2026-11-11-1-markdown-and-prompt-reads.md` specifies. `name` is a direct child, `../name` is a sibling, and `/a/b` starts at the top of the prompt and names any section. The level is not in the address, so moving a section to another depth changes no path.

- `call`, `jump`, `tasks.spawn`, and `tasks.fanout` take the two relative forms, which are a section's visible set. `prompt.section` and `prompt.list` take those and a path from the top. `require` takes only a path from the top, so one library has one name on every line of a prompt.
- `section_path` in `runvil-runtime` is the one lookup, with an entry for each of those three rules. It starts from an `Origin`, the H1 or a section, and the H1's children are the top-level sections. The path grammar is `runvil_markdown::split`, shared with paths over parsed text. `section_pos` holds the tree positions that `heading_address` held beside the lookup.
- A path that names no section raises one error from every function, which says where the lookup looked and lists nothing: ``section `Grand` not found: `/Main` has no child `Grand` ``. A path from the top reports the step where it stopped.
- `require` needs no starting point, so `RequireOrigin`, the wider reach, and the key a loading library passed to the resolver are gone. The resolver takes the path alone.
- A library is reported by its path from the top: the three library-load events carry `/shared_stuff` in `library`, and the cycle error reads `require cycle: /a -> /b -> /a`. `Library::heading` is `Library::path`.
- Sibling titles are unique, so the lookup has no ambiguity error.
- Every prompt and test in the repository names sections by path. The tests that asserted the reach and the listed sections are replaced by tests of the three forms, of each miss message, and of a path from the top read and required from the H1, a top-level section, and a nested one.
- Left for the commits that follow: a read that names no section still returns nil, so the message for a path from the top given to `call` names `require` and `prompt.section` only; a relative path in a library's code still starts at the running section; and `prompt.list` still exists.
- Where the design is silent: a path from the top that holds `..` raises `uses ".."; a path from the top takes none`.
`prompt.section` returned nil for a path that names no section, so a misspelled title read as nothing and failed later, somewhere else. It now raises the not-found error that `call` raises for the same path, and `prompt.section_or` is the read that returns nil instead. A malformed path and a target that is not a string raise from both.

- The read callback returns a `SectionRead`: the section's text, or the not-found error for a path that is well-formed and names nothing. `prompt.section` raises that error, and `prompt.section_or` and `prompt.list` return nil for it.
- The message for a path from the top given to `call`, `jump`, or a `tasks` function now names all three functions that take one: `require`, `prompt.section`, and `prompt.section_or`.
- The tests assert that `call` and `prompt.section` raise the same text for the same path from the same section, and that only `prompt.section` raises for an absence.
A relative path in a library's code named a neighbor of whichever section was using the library, so a library could not keep templates or workers of its own, and one line meant a different section for each user. It now names a neighbor of the library section, while the library loads and when its functions run later.

- `require` loads each block of a library with an environment table of its own, the facility Pack preludes use. The table holds `call`, `prompt`, and `tasks` made for the library, and sends every other global read and every global write on to the VM's globals, and so through the `_G` guard. `library_env` builds it, and its metatable is protected.
- `call`, `tasks.spawn`, and `tasks.fanout` are made by factories over the library's identity, and the `call` and `spawn` requests carry it as `from`. The scheduler resolves the target from the library's position when a request names one, and from the chain's current section otherwise. The read callback takes the same optional key.
- A function keeps the place it was written in: a callback a section passes to a library names the section's neighbors, and a tool handler written in a library names the library's. A name passed as a string is resolved where it is used.
- `jump` is not made for the library. It moves the running walk, so its path starts at the running section in a library's code too. Inside a library, `_G.prompt`, `_G.call`, and `_G.tasks` are the running section's own.
- A miss in a library's code names the library as the section it searched, and a miss through `_G` names the running section.
- The `prompt` table moves from `vm/install.rs` to `prompt_reads`, which builds the VM's table and each library's from one function.
- 24 tests drive a section VM and 13 run whole prompts through the scheduler. In the whole prompts the library and the section using it both have a child with the same title, so a lookup from the wrong place returns the wrong text. With the environment taken out, 20 of them fail.
A prompt had no way to read the structure of Markdown it did not write: a model's reply, a stored document, or the text of one of its own sections. `markdown` parses any text into plain Lua tables, the way `json.decode` does for JSON, as `runvil-design/design/2026-11-11-1-markdown-and-prompt-reads.md` specifies.

- `markdown.parse(text)` returns a marked list of blocks. A block is a record with its `kind`, its `line`, and the fields of its kind, so a parse result passes `json.encode`, can be stored in `var`, and can be a `tasks.fanout` collection.
- `markdown.section(blocks, path [, selector [, n]])` finds the one section a path names, or the one block of it a selector picks. It raises when the section or the block is not there, and `markdown.section_or` returns nil for that. Several matches, and a malformed path, selector, or index, raise from both.
- `markdown.select(blocks, selector)` collects every match at any depth in file order, and `markdown.render(blocks)` writes blocks back as text.
- A lookup returns the tables that are already inside the list it was given, and walks them without calling into Lua. It reads through sealed views by the rule `json.encode` uses, which moves from `json/encode.rs` to `proxy::unseal`, so blocks read back from `var` work with every function. It refuses a list on its own path and one nested more than 127 lists deep.
- `runvil-markdown` gains the messages a lookup raises, beside the grammars they belong to: `Path::no_match`, `Path::ambiguous`, and `pick`, which says which of a selector's matches a lookup keeps.
- `markdown.parse` takes the input check of `json.decode`, with its 8,388,608-byte limit.
- Where the design is silent: a lookup counts the blocks it visits against the VM's walk budget and raises `blocks are too large to walk`, because a table shared by many parents is visited once for each; a path or a selector that is not a string raises `path must be a string` or `selector must be a string`; a block other than a section given where a list belongs raises `got a fence block`; a message that lists lines leaves them out when a block records none; a fence table with no `lang` field matches no language; `markdown.render` requires every field of a block's kind except `line`; and a Pack prelude's environment does not hold `markdown`.
- One wording differs from the design's table: `markdown.parse(42)` says `got integer`, the name every other Engine message gives that type, where the table says `got number`.
- The tests run every example of the design through a section VM, and four whole prompts parse a stored file, parse the text of a `prompt` read, carry a parse result to a later section in `var`, and fan out over parsed sections.
`prompt.section(path, selector [, n])` and its `prompt.section_or` twin return one block of a section's own content: a template kept in a fence, the items of a list, or any other single block. The selector and the index are the ones `markdown.section` takes, and the block is the table `markdown.parse` builds for it.

- The read parses the section's own raw Markdown by the block rules and picks the only block the selector matches, or the `n`th when there is an index. The table is built for the call, and its `line` counts lines of the prompt file.
- A block that is not there raises from `prompt.section` and is nil from `prompt.section_or`. Several matches with no index, and a malformed selector or index, raise from both. The selector and index are checked before the path is looked up.
- The kinds `section` and `frontmatter` raise, because a section's own content holds neither. Frontmatter is never recognized there, since a prompt's is at the top of the file.
- `Section` records the file line its Markdown starts on, and `SectionText` reads that Markdown in place from the prompt text the run shares. So `prompt.section(path)` copies only the string it returns, and the selector form copies only the chosen block's strings.
- The tests run the design's report prompt and assert every line of its worked example from `Write`, from one level down in `Template`, from two workers under different parents, from the H1 body, and from a library that reads its own template and its user's list.
The selector form of prompt.section reads a list, a fence, or any other
block with one syntax, so a second read for lists and a second notion of
a list in the parser are no longer needed. A list is a list block and
nothing else, and a section that holds only a list is an ordinary
section.

- The read is prompt.section(path, "list").items. The prompt table holds
  section and section_or and nothing else.
- The prompt parser no longer builds list items. Section loses items()
  and is_list(), and the list module is deleted.
- The parse error for a bullet with no content is removed with its
  ErrorCode, its tag, its prose, the Workshop server's wire code, and
  the fixture that triggered it. The number 104 is left unused.
- tasks.spawn and tasks.fanout no longer refuse a section that holds
  only a list. It is entered like any section with no Lua and runs
  nothing of its own.
- The error for a second parameter of tasks.fanout that is not a
  collection names the read that gives the items of a list.
- Items now follow the block rules, so two results differ for a prompt
  written before this change: a nested bullet is part of its parent's
  item, and a bullet with no content is the item "".
A section is named by a path, so the last two places that described one as a heading now say what they hold.

- The Lua test rig binds a recorded jump's target as `path`.
- The event module's note on what an author controls says that a library is reported by a path made of heading text.
markdown.render rebuilt each block in one fixed style, so rendering a
parse changed the text. A list that started at 3 was renumbered from 1.
Markers, fences, and underlined headings were rewritten, and a title's
markup and a frontmatter's comments were lost. A tilde fence whose label
starts with a tilde was written with the two run together, which cost it
its closing line and every block after it.

Every block now holds `source`, the lines it was read from with the
blank lines after them. The sources of a parse are the whole text, and
markdown.render writes sources and nothing else, so a parse is written
back as the text it was read from.

- A block's source runs from its first line to the first line of the
  next block. A section's is its heading's, and blank lines at the top
  of the text are in the first block's. Text of blank lines alone has
  no block, so it is the one text that is not written back.
- The selector `*` matches every block. markdown.select(blocks, "*") is
  a document as one flat list, and the sources of that list join to the
  text. `*` works in markdown.section and in the prompt reads too.
- markdown.render reads `source`, and reads `kind` and `blocks` only to
  know what comes next. An edit of any other field changes nothing that
  is written, and a block with no `source` raises and names the block.
- The writer adds a line ending of its own in two cases, and neither
  occurs inside one parse: before a block when the text so far does not
  end with one, and a blank line between two prose blocks.
- A list now ends with its last item. The Markdown library ends a list
  where the next block starts, so a link definition after a list was in
  no field of any block. It is prose now.
- The writer that rebuilt blocks is deleted, and so is the reader that
  checked every field for it.
- A byte order mark and the line endings are read as before, so every
  source uses `\n` only.

The tests check the 75 sample texts and 2,000 texts generated from a
fixed seed: the sources join to the text, each is whole lines, each
agrees with its block's line, and each reads alone as its own block.
Two tests state the cases where the last does not hold.

Plan: /plan/2026-11-12-1-exact-markdown-source.plan.md
@coderabbitai

coderabbitai Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 211 files, which is 111 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: d181342f-4014-408a-b1c3-0d2179d03d6d
Commits

Reviewing files that changed from the base of the PR and between 5d644a8 and c64f856.

Files ignored due to path filters: 1

  • Cargo.lock is excluded by !**/*.lock
Files selected for processing: 211

  • Cargo.toml
  • crates/build-xtask/src/engine_clippy.rs
  • crates/harness-internal/runner/tests/it/effect_loop-cap.rs
  • crates/harness-internal/runner/tests/it/effect_loop-vfs.rs
  • crates/harness-internal/runner/tests/it/harness-inbox.rs
  • crates/harness-internal/runner/tests/it/harness-stop-cap.rs
  • crates/harness-internal/runner/tests/it/harness-stop-timing.rs
  • crates/harness-internal/runner/tests/it/harness-stop.rs
  • crates/harness-internal/runner/tests/it/performers.rs
  • crates/harness-internal/runner/tests/it/render-calls.rs
  • crates/harness-internal/runner/tests/it/support.rs
  • crates/runvil-engine/public-api.txt
  • crates/runvil-engine/tests/prompts/invalid/list-h3-non-list-content.md
  • crates/runvil-engine/tests/suite/effect.rs
  • crates/runvil-engine/tests/suite/ids.rs
  • crates/runvil-engine/tests/suite/parsing.rs
  • crates/runvil-internal/lua/Cargo.toml
  • crates/runvil-internal/lua/src/__impl_coro.lua
  • crates/runvil-internal/lua/src/__impl_fanout.lua
  • crates/runvil-internal/lua/src/__impl_require.lua
  • crates/runvil-internal/lua/src/__impl_tasks.lua
  • crates/runvil-internal/lua/src/collection.rs
  • crates/runvil-internal/lua/src/coro.rs
  • crates/runvil-internal/lua/src/error.rs
  • crates/runvil-internal/lua/src/error_value.rs
  • crates/runvil-internal/lua/src/globals.rs
  • crates/runvil-internal/lua/src/json.rs
  • crates/runvil-internal/lua/src/json/decode.rs
  • crates/runvil-internal/lua/src/json/encode.rs
  • crates/runvil-internal/lua/src/lib.rs
  • crates/runvil-internal/lua/src/library_env.rs
  • crates/runvil-internal/lua/src/markdown.rs
  • crates/runvil-internal/lua/src/markdown/blocks.rs
  • crates/runvil-internal/lua/src/markdown/lookup.rs
  • crates/runvil-internal/lua/src/markdown/walk.rs
  • crates/runvil-internal/lua/src/program.rs
  • crates/runvil-internal/lua/src/prompt_reads.rs
  • crates/runvil-internal/lua/src/protocol/parse.rs
  • crates/runvil-internal/lua/src/protocol/parse/tasks.rs
  • crates/runvil-internal/lua/src/protocol/request.rs
  • crates/runvil-internal/lua/src/protocol/tests/parse.rs
  • crates/runvil-internal/lua/src/protocol/tests/parse_tasks.rs
  • crates/runvil-internal/lua/src/proxy.rs
  • crates/runvil-internal/lua/src/require.rs
  • crates/runvil-internal/lua/src/section.rs
  • crates/runvil-internal/lua/src/test_support.rs
  • crates/runvil-internal/lua/src/test_vm.rs
  • crates/runvil-internal/lua/src/tests.rs
  • crates/runvil-internal/lua/src/tests/json.rs
  • crates/runvil-internal/lua/src/tests/library_load.rs
  • crates/runvil-internal/lua/src/tests/markdown.rs
  • crates/runvil-internal/lua/src/tests/markdown/parse.rs
  • crates/runvil-internal/lua/src/tests/markdown/render.rs
  • crates/runvil-internal/lua/src/tests/markdown/section.rs
  • crates/runvil-internal/lua/src/tests/markdown/select.rs
  • crates/runvil-internal/lua/src/tests/markdown/views.rs
  • crates/runvil-internal/lua/src/tests/prompt_reads.rs
  • crates/runvil-internal/lua/src/tests/require.rs
  • crates/runvil-internal/lua/src/tests/require/environment.rs
  • crates/runvil-internal/lua/src/tests/require/errors.rs
  • crates/runvil-internal/lua/src/tests/require/jump.rs
  • crates/runvil-internal/lua/src/tests/require/prose.rs
  • crates/runvil-internal/lua/src/tests/require/reports.rs
  • crates/runvil-internal/lua/src/tests/sandbox.rs
  • crates/runvil-internal/lua/src/tests/section_vm.rs
  • crates/runvil-internal/lua/src/vm.rs
  • crates/runvil-internal/lua/src/vm/install.rs
  • crates/runvil-internal/lua/src/vm/run.rs
  • crates/runvil-internal/markdown/Cargo.toml
  • crates/runvil-internal/markdown/README.md
  • crates/runvil-internal/markdown/src/block.rs
  • crates/runvil-internal/markdown/src/index.rs
  • crates/runvil-internal/markdown/src/lib.rs
  • crates/runvil-internal/markdown/src/parse-tests-source.rs
  • crates/runvil-internal/markdown/src/parse-tests.rs
  • crates/runvil-internal/markdown/src/parse.rs
  • crates/runvil-internal/markdown/src/parse/events.rs
  • crates/runvil-internal/markdown/src/parse/flat.rs
  • crates/runvil-internal/markdown/src/parse/frontmatter.rs
  • crates/runvil-internal/markdown/src/parse/tree.rs
  • crates/runvil-internal/markdown/src/path.rs
  • crates/runvil-internal/markdown/src/render-tests.rs
  • crates/runvil-internal/markdown/src/render.rs
  • crates/runvil-internal/markdown/src/selector.rs
  • crates/runvil-internal/markdown/src/test_support.rs
  • crates/runvil-internal/prompt/src/body_text.rs
  • crates/runvil-internal/prompt/src/error-tests.rs
  • crates/runvil-internal/prompt/src/lib.rs
  • crates/runvil-internal/prompt/src/list.rs
  • crates/runvil-internal/prompt/src/parse.rs
  • crates/runvil-internal/prompt/src/prompt.rs
  • crates/runvil-internal/prompt/src/sections.rs
  • crates/runvil-internal/prompt/src/test_support.rs
  • crates/runvil-internal/prompt/src/tests/breaks.rs
  • crates/runvil-internal/prompt/src/tests/headings.rs
  • crates/runvil-internal/prompt/src/tests/lists.rs
  • crates/runvil-internal/runtime/Cargo.toml
  • crates/runvil-internal/runtime/src/execute/run/tests-drops.rs
  • crates/runvil-internal/runtime/src/execute/run/tests-inbox.rs
  • crates/runvil-internal/runtime/src/execute/run/tests-reply.rs
  • crates/runvil-internal/runtime/src/execute/run/tests-send.rs
  • crates/runvil-internal/runtime/src/execute/run/tests-steer.rs
  • crates/runvil-internal/runtime/src/execute/scheduler.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/chain.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/chain_record.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/dispatch.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/h1.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/step.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/tasks.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/test_hooks.rs
  • crates/runvil-internal/runtime/src/execute/scheduler/walk.rs
  • crates/runvil-internal/runtime/src/execute/section_context.rs
  • crates/runvil-internal/runtime/src/execute/section_vm.rs
  • crates/runvil-internal/runtime/src/execute/tests/adhoc_tools.rs
  • crates/runvil-internal/runtime/src/execute/tests/batch_turn.rs
  • crates/runvil-internal/runtime/src/execute/tests/context.rs
  • crates/runvil-internal/runtime/src/execute/tests/effects.rs
  • crates/runvil-internal/runtime/src/execute/tests/exec_flow.rs
  • crates/runvil-internal/runtime/src/execute/tests/fanout_acceptance.rs
  • crates/runvil-internal/runtime/src/execute/tests/happens_before-concurrency.rs
  • crates/runvil-internal/runtime/src/execute/tests/happens_before.rs
  • crates/runvil-internal/runtime/src/execute/tests/live_infer.rs
  • crates/runvil-internal/runtime/src/execute/tests/model_and_reply-globals.rs
  • crates/runvil-internal/runtime/src/execute/tests/model_and_reply.rs
  • crates/runvil-internal/runtime/src/execute/tests/offering-packs.rs
  • crates/runvil-internal/runtime/src/execute/tests/parallel_tool_calls-withdrawn.rs
  • crates/runvil-internal/runtime/src/execute/tests/parallel_tool_calls.rs
  • crates/runvil-internal/runtime/src/execute/tests/preludes.rs
  • crates/runvil-internal/runtime/src/execute/tests/provenance.rs
  • crates/runvil-internal/runtime/src/execute/tests/rendered_tools.rs
  • crates/runvil-internal/runtime/src/execute/tests/run_termination.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/chain_model.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/concurrency-stepped.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/concurrency.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/failures.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/fanout/arms.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/fanout/failure_semantics.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/fanout/scheduling.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/fanout_model.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/h1/control_flow.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/h1/pass.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/walk/chains.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/walk/child_levels.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/walk/core_rules.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/walk/driving.rs
  • crates/runvil-internal/runtime/src/execute/tests/scheduler/walk/jumps.rs
  • crates/runvil-internal/runtime/src/execute/tests/section_messages.rs
  • crates/runvil-internal/runtime/src/execute/tests/serial_driver.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/args_surface.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/chains.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/child_walks.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/fanout_arms.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/fanout_collections.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/globals.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/h1_control.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/prompt_blocks.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/prompt_reads.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/exec_flow/store_failures.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/fanout.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/global_metatable.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/lazy_prose.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/markdown.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/parsing.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/effects.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/environment.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/failures.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/loading.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/prose.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/reach.rs
  • crates/runvil-internal/runtime/src/execute/tests/suite/require/walk.rs
  • crates/runvil-internal/runtime/src/execute/tests/tasks-chain-end.rs
  • crates/runvil-internal/runtime/src/execute/tests/tasks.rs
  • crates/runvil-internal/runtime/src/execute/tests/timeouts.rs
  • crates/runvil-internal/runtime/src/execute/tests/tool_call_access.rs
  • crates/runvil-internal/runtime/src/execute/tests/tool_call_arm-adhoc-handlers.rs
  • crates/runvil-internal/runtime/src/execute/tests/tool_call_origins.rs
  • crates/runvil-internal/runtime/src/execute/tests/tool_loop-scope-gate.rs
  • crates/runvil-internal/runtime/src/execute/tests/unified_pipeline.rs
  • crates/runvil-internal/runtime/src/execute/tests/waits.rs
  • crates/runvil-internal/runtime/src/execute/walk_target-tests.rs
  • crates/runvil-internal/runtime/src/execute/walk_target.rs
  • crates/runvil-internal/runtime/src/heading_address.rs
  • crates/runvil-internal/runtime/src/lib.rs
  • crates/runvil-internal/runtime/src/lua.rs
  • crates/runvil-internal/runtime/src/lua/tests.rs
  • crates/runvil-internal/runtime/src/lua/tests/coroutine.rs
  • crates/runvil-internal/runtime/src/lua/tests/errors.rs
  • crates/runvil-internal/runtime/src/lua/tests/shims.rs
  • crates/runvil-internal/runtime/src/section_path-tests.rs
  • crates/runvil-internal/runtime/src/section_path.rs
  • crates/runvil-internal/runtime/src/section_pos.rs
  • crates/runvil-internal/runtime/src/test_support/recording/forward-tests-variants.rs
  • crates/runvil-internal/runtime/src/test_support/recording/forward-tests.rs
  • crates/runvil-internal/runtime/src/test_support/recording/observation.rs
  • crates/runvil-internal/runtime/tests/prompts/execution/fanout-arm-failure.md
  • crates/runvil-internal/runtime/tests/prompts/execution/fanout-basic.md
  • crates/runvil-internal/runtime/tests/prompts/execution/fanout-cross-arm-append.md
  • crates/runvil-internal/runtime/tests/prompts/execution/fanout-epilog.md
  • crates/runvil-internal/runtime/tests/prompts/execution/fanout-store-writes.md
  • crates/runvil-internal/runtime/tests/prompts/valid/require-library.md
  • crates/runvil-internal/types/src/emitter.rs
  • crates/runvil-internal/types/src/error-tests.rs
  • crates/runvil-internal/types/src/error.rs
  • crates/runvil-internal/types/src/event-tests-library.rs
  • crates/runvil-internal/types/src/event.rs
  • crates/runvil/public-api.txt
  • crates/workshop/server/src/error.rs
  • plan/2026-11-12-1-exact-markdown-source.plan.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@greptile-apps

greptile-apps Bot commented Nov 12, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[High impact] This PR appears safe to merge; no actionable issue was established.

Summary

This PR replaces heading addresses with section paths and adds the markdown global.

  • Runvil section references now use paths made from section titles.
  • A library's relative helpers now start from its own section.
  • Lua can turn Markdown text into blocks and work with them.
  • Prompt reads can return one chosen block from a section.
  • List sections and the prompt.list reader are removed.

vinniefalco explicitly identifies the old heading addresses, prompt.list, list sections, and missing-section return behavior as intentional removals. The change to library-relative lookups is also intentional.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Lua code] --> B{Function}
  B -->|call or tasks| C{Library binding?}
  C -->|Yes| D[Resolve from library section]
  C -->|No| E[Resolve from running section]
  B -->|jump| E
  B -->|require| F[Resolve from prompt top]
  B -->|prompt read| G[Resolve path and optionally select block]
  B -->|markdown.parse| H[Parse text into plain block tables]
  H --> I[Look up or render blocks]
Loading

Reviews (1) · Last reviewed commit: "Keep each block's source so markdown.ren..." · Reviewed by Greptile

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Relative-path validation incorrectly reports “has more than one name” for paths like ../.. and Kid/.., requiring a clearer diagnostic and updated exact-message assertions.

1 open issue
What changed in this PR

Updates Runvil’s prompt language to use title-based section paths and structured Markdown reads, supported by a new internal Markdown crate and Lua namespace.

Changes:

  • Migrate section references and library loading to paths, including library-relative lookups.
  • Add Markdown parsing, selection, and rendering, plus strict and optional prompt reads with block selectors.
  • Remove legacy list sections and their error code, and update tests, public API listings, and dependencies.
File Description
crates/​workshop/​server/​src/​error.rs Remove the obsolete list-error mapping.
crates/​runvil/​public-api.txt Remove ListEmptyItem from the Harness API listing.
crates/​runvil-internal/​types/​src/​event.rs Document library paths in load events.
crates/​runvil-internal/​types/​src/​event-tests-library.rs Update library-event serialization examples to paths.
crates/​runvil-internal/​types/​src/​error.rs Remove the legacy list-item error code.
crates/​runvil-internal/​types/​src/​error-tests.rs Update error-code coverage after removal.
crates/​runvil-internal/​types/​src/​emitter.rs Update library-path documentation and assertions.
crates/​runvil-internal/​runtime/​tests/​prompts/​valid/​require-library.md Load fixture libraries by absolute path.
crates/​runvil-internal/​runtime/​tests/​prompts/​execution/​fanout-store-writes.md Use section paths and list-block reads.
crates/​runvil-internal/​runtime/​tests/​prompts/​execution/​fanout-epilog.md Migrate fanout targets and collection reads.
crates/​runvil-internal/​runtime/​tests/​prompts/​execution/​fanout-cross-arm-append.md Name the worker by relative path.
crates/​runvil-internal/​runtime/​tests/​prompts/​execution/​fanout-basic.md Use path-based fanout and list selection.
crates/​runvil-internal/​runtime/​tests/​prompts/​execution/​fanout-arm-failure.md Migrate worker and list references.
crates/​runvil-internal/​runtime/​src/​test_support/​recording/​observation.rs Document library paths in observations.
crates/​runvil-internal/​runtime/​src/​test_support/​recording/​forward-tests.rs Expect paths in forwarded library events.
crates/​runvil-internal/​runtime/​src/​test_support/​recording/​forward-tests-variants.rs Use paths in library-event samples.
crates/​runvil-internal/​runtime/​src/​lua/​tests/​errors.rs Use a relative target in traceback coverage.
crates/​runvil-internal/​runtime/​src/​lua/​tests/​coroutine.rs Verify jump transfers carry paths.
crates/​runvil-internal/​runtime/​src/​lua/​tests.rs Adapt VM setup to section-read results.
crates/​runvil-internal/​runtime/​src/​lua.rs Re-export the new section-read type internally.
crates/​runvil-internal/​runtime/​src/​lib.rs Register path modules and document Markdown dependencies.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​unified_pipeline.rs Use a sibling path in pipeline coverage.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​tool_loop-scope-gate.rs Update the handler’s section-call target.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​tool_call_origins.rs Migrate jump and fanout targets.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​tool_call_arm-adhoc-handlers.rs Use a sibling path after handler failure.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​tool_call_access.rs Update spawned-task references.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​require/​walk.rs Load libraries through absolute paths.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​require/​prose.rs Migrate library-prose tests to paths.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​require/​loading.rs Update loading targets and event expectations.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​require/​effects.rs Use absolute library paths in effect tests.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​require.rs Register library-environment coverage.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​parsing.rs Expect path-based library source text.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​lazy_prose.rs Update the library reference in lazy-prose coverage.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​global_metatable.rs Migrate metatable-library references.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​fanout.rs Use relative worker paths and clarify terminology.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​exec_flow/​store_failures.rs Migrate calls, workers, and libraries to paths.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​exec_flow/​h1_control.rs Assert path-resolution diagnostics from H1.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​exec_flow/​globals.rs Update path-based control-flow coverage.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​exec_flow.rs Register prompt-block read tests.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite/​args_surface.rs Use sibling paths in argument-inheritance tests.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​suite.rs Register Markdown integration coverage.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​serial_driver.rs Update the serial-driver fanout target.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​section_messages.rs Migrate section-message test references.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​walk/​jumps.rs Update jump paths and related test wording.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​walk/​driving.rs Use paths in nested-call and failure tests.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​walk/​core_rules.rs Migrate contained-call targets.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​h1/​pass.rs Use an absolute library path in H1.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​h1/​control_flow.rs Update H1 targets and missing-section diagnostics.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​fanout/​scheduling.rs Use relative worker paths in scheduling tests.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​fanout/​failure_semantics.rs Migrate targets and remove the list-worker rejection test.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​fanout/​arms.rs Update arm calls, jumps, and library references.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​failures.rs Migrate fanout failure scenarios to paths.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​concurrency.rs Update nested spawn and fanout paths.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​concurrency-stepped.rs Migrate stepped-concurrency section references.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​scheduler/​chain_model.rs Use paths in model-inheritance scenarios.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​run_termination.rs Update the termination fixture’s child path.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​rendered_tools.rs Load the offers library by absolute path.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​provenance.rs Migrate provenance-test section targets.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​preludes.rs Update library, worker, and task references.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​parallel_tool_calls.rs Use a sibling path for the canceled task.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​parallel_tool_calls-withdrawn.rs Migrate task targets in withdrawal scenarios.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​offering-packs.rs Update section and library references in offering tests.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​model_and_reply.rs Update helper loading and library-event expectations.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​model_and_reply-globals.rs Migrate library paths and list-block reads.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​live_infer.rs Update live-inference paths and collection reads.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​happens_before-concurrency.rs Migrate nested concurrency targets.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​fanout_acceptance.rs Update worker paths and remove obsolete commentary.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​exec_flow.rs Migrate calls and remove the old resolver test.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​effects.rs Update the timer scenario’s task path.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​context.rs Update the shared fanout fixture.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​batch_turn.rs Use a sibling path in handler-call coverage.
crates/​runvil-internal/​runtime/​src/​execute/​tests/​adhoc_tools.rs Migrate jump targets in handler tests.
crates/​runvil-internal/​runtime/​src/​execute/​section_vm.rs Pass library origins into prompt-read callbacks.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​test_hooks.rs Import section-position types from their new module.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​tasks.rs Resolve spawns from library origins; remove list-worker rejection.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​step.rs Carry path terminology through jump handling.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​h1.rs Resolve H1 jumps through the path resolver.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​dispatch.rs Forward library origins for calls and spawns.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​chain.rs Update the section-position import.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler/​chain_record.rs Update production and test position imports.
crates/​runvil-internal/​runtime/​src/​execute/​scheduler.rs Correct the section-position documentation link.
crates/​runvil-internal/​runtime/​src/​execute/​run/​tests-steer.rs Migrate steering scenarios to task paths.
crates/​runvil-internal/​runtime/​src/​execute/​run/​tests-send.rs Update task-message scenario targets.
crates/​runvil-internal/​runtime/​src/​execute/​run/​tests-inbox.rs Migrate inbox calls and spawned-task references.
crates/​runvil-internal/​runtime/​src/​execute/​run/​tests-drops.rs Update timed-wait child targets.
crates/​runvil-internal/​runtime/​Cargo.toml Add the Markdown crate dependency.
crates/​runvil-internal/​prompt/​src/​tests/​headings.rs Verify Markdown source lines and shared ranges.
crates/​runvil-internal/​prompt/​src/​tests/​breaks.rs Remove legacy list-section parsing tests.
crates/​runvil-internal/​prompt/​src/​test_support.rs Initialize source-line metadata in synthetic sections.
crates/​runvil-internal/​prompt/​src/​sections.rs Track Markdown locations and remove list classification.
crates/​runvil-internal/​prompt/​src/​prompt.rs Expose Markdown ranges and lines; remove list APIs.
crates/​runvil-internal/​prompt/​src/​parse.rs Remove obsolete list-error documentation.
crates/​runvil-internal/​prompt/​src/​list.rs Delete the legacy list-section parser.
crates/​runvil-internal/​prompt/​src/​lib.rs Remove the list-parser module.
crates/​runvil-internal/​prompt/​src/​error-tests.rs Remove empty-list-item error coverage.
crates/​runvil-internal/​prompt/​src/​body_text.rs Expose shared text and byte ranges.
crates/​runvil-internal/​markdown/​src/​render.rs Add source-preserving Markdown rendering.
crates/​runvil-internal/​markdown/​src/​parse.rs Add normalized, layered Markdown parsing.
crates/​runvil-internal/​markdown/​src/​lib.rs Define the crate’s interface and invariants.
crates/​runvil-internal/​markdown/​src/​index.rs Add indexed selection and match-location formatting.
crates/​runvil-internal/​markdown/​README.md Describe the Markdown crate’s responsibilities.
crates/​runvil-internal/​markdown/​Cargo.toml Declare the new internal crate.
crates/​runvil-internal/​lua/​src/​vm/​run.rs Use path terminology for jump outcomes.
crates/​runvil-internal/​lua/​src/​vm.rs Update jump wording and remove an unused helper.
crates/​runvil-internal/​lua/​src/​tests/​section_vm.rs Adapt control-global tests to the read interface.
crates/​runvil-internal/​lua/​src/​tests/​sandbox.rs Update library resolver signatures and errors.
crates/​runvil-internal/​lua/​src/​tests/​require/​reports.rs Expect paths in library-load reports.
crates/​runvil-internal/​lua/​src/​tests/​require/​prose.rs Migrate library-prose fixtures to paths.
crates/​runvil-internal/​lua/​src/​tests/​require/​jump.rs Update library jump-transfer expectations.
crates/​runvil-internal/​lua/​src/​tests/​markdown.rs Add shared Markdown samples and assertion helpers.
crates/​runvil-internal/​lua/​src/​tests/​library_load.rs Use paths in library observation tests.
crates/​runvil-internal/​lua/​src/​tests/​json.rs Move reusable assertions into shared test support.
crates/​runvil-internal/​lua/​src/​tests.rs Register Markdown/read tests and share helpers.
crates/​runvil-internal/​lua/​src/​test_vm.rs Support configurable section-read callbacks.
crates/​runvil-internal/​lua/​src/​test_support.rs Update jump-result handling terminology.
crates/​runvil-internal/​lua/​src/​section.rs Add shared section text, read outcomes, and library paths.
crates/​runvil-internal/​lua/​src/​proxy.rs Share bounded proxy unsealing without Lua callbacks.
crates/​runvil-internal/​lua/​src/​protocol/​tests/​parse.rs Update call paths and verify absent library origins.
crates/​runvil-internal/​lua/​src/​protocol/​tests/​parse_tasks.rs Verify library origins on call and spawn requests.
crates/​runvil-internal/​lua/​src/​protocol/​request.rs Add library origins to calls and spawns.
crates/​runvil-internal/​lua/​src/​protocol/​parse/​tasks.rs Parse the spawn request’s library origin.
crates/​runvil-internal/​lua/​src/​protocol/​parse.rs Parse library origins for call requests.
crates/​runvil-internal/​lua/​src/​program.rs Load library chunks with dedicated environments.
crates/​runvil-internal/​lua/​src/​markdown/​blocks.rs Convert Markdown blocks to Lua tables and render them.
crates/​runvil-internal/​lua/​src/​lib.rs Register Markdown, library-environment, and prompt-read modules.
crates/​runvil-internal/​lua/​src/​json/​encode.rs Reuse the shared proxy-unsealing implementation.
crates/​runvil-internal/​lua/​src/​json/​decode.rs Share bounded text-input validation.
crates/​runvil-internal/​lua/​src/​json.rs Expose text validation internally.
crates/​runvil-internal/​lua/​src/​globals.rs Reserve the markdown global name.
crates/​runvil-internal/​lua/​src/​error.rs Update error documentation to path terminology.
crates/​runvil-internal/​lua/​src/​error_value.rs Remove obsolete list-error classification.
crates/​runvil-internal/​lua/​src/​coro.rs Register factories for library-bound control functions.
crates/​runvil-internal/​lua/​src/​collection.rs Point collection errors to list-block reads.
crates/​runvil-internal/​lua/​src/​__impl_tasks.lua Create spawn functions bound to library origins.
crates/​runvil-internal/​lua/​src/​__impl_require.lua Use absolute library paths in resolution and reporting.
crates/​runvil-internal/​lua/​src/​__impl_fanout.lua Carry library origins into fanout spawns.
crates/​runvil-internal/​lua/​src/​__impl_coro.lua Create library-bound section-call functions.
crates/​runvil-internal/​lua/​Cargo.toml Add the Markdown crate dependency.
crates/​runvil-engine/​tests/​suite/​parsing.rs Remove the obsolete invalid-list fixture expectation.
crates/​runvil-engine/​tests/​suite/​ids.rs Use sibling paths in task-ID tests.
crates/​runvil-engine/​tests/​suite/​effect.rs Migrate effect-test task references.
crates/​runvil-engine/​tests/​prompts/​invalid/​list-h3-non-list-content.md Delete the now-valid empty-list-item fixture.
crates/​runvil-engine/​public-api.txt Remove ListEmptyItem from the Engine API listing.
crates/​harness-internal/​runner/​tests/​it/​support.rs Update the shared timed-child target.
crates/​harness-internal/​runner/​tests/​it/​render-calls.rs Migrate multi-model task references.
crates/​harness-internal/​runner/​tests/​it/​performers.rs Update the timer performer’s child path.
crates/​harness-internal/​runner/​tests/​it/​harness-stop.rs Use sibling paths in stop scenarios.
crates/​harness-internal/​runner/​tests/​it/​harness-stop-timing.rs Migrate timed-stop child references.
crates/​harness-internal/​runner/​tests/​it/​harness-stop-cap.rs Update the cancellation scenario’s task path.
crates/​harness-internal/​runner/​tests/​it/​harness-inbox.rs Migrate child targets in inbox scenarios.
crates/​harness-internal/​runner/​tests/​it/​effect_loop-vfs.rs Update concurrent file-effect task references.
crates/​harness-internal/​runner/​tests/​it/​effect_loop-cap.rs Migrate task targets in effect-limit fixtures.
crates/​build-xtask/​src/​engine_clippy.rs Correct the documented internal-crate count.
Cargo.toml Register the Markdown workspace member and dependency.
Cargo.lock Record the new crate and dependency links.

Review effort: Max

Comment on lines +224 to +228
_ => {
return Err(error::make_lua_runtime_error(format!(
"section path \"{given}\" has more than one name; a relative path is a child's \
name, or \"../\" and a sibling's name"
)));
@vinniefalco
vinniefalco merged commit c64f856 into cppalliance:master Nov 12, 2026
32 checks passed

This branch was previously deployed

1 inactive deployment
github-pages — c64f8563 Deployed Nov 12, 2026 by vinniefalco via deploy #184
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants