Private
Public Access
0
0

docs(ssdl): rename SSDL shape symbols to concise form (o->, o=>)

Final vocabulary:
- ===>        -> ->        (codepath)
- ===>W===>  -> =>        (wide codepath)
- o==>       -> o->       (codecycle)
- oo==>oo    -> o=>       (wide codecycle)
- ===>B===>  -> ->B->     (codepath with branch)
- ===>M===>  -> ->M->     (codepath with merge)

Composites ===>B===> and ===>M===> preserved as ->B->/->M-> so the
branch/merge markers stay visible (vs. dropping them entirely).

Scope: 3 reports files (computational_shapes_ssdl_digest,
proposed_new_tracks, session_synthesis), 4 intent_dsl_survey files
(plan, report, report_v1.1, report_v1.2), 3 nagent_review files
(state.toml description, v2_2, v2_3). All old symbols verified gone
via grep; all new symbols verified present at expected locations.
This commit is contained in:
2026-06-12 12:52:20 -04:00
parent dff97b15c3
commit c4085319ff
10 changed files with 740 additions and 738 deletions
@@ -524,7 +524,7 @@ For each verb, the 5-column table:
- "Borrowed from" note
- SSDL shape tag
Tier 1 SSDL shape tags: most are `[I]` (single instruction) since they're scalar operations; the range `for x .. n` is `o==>` (codecycle).
Tier 1 SSDL shape tags: most are `[I]` (single instruction) since they're scalar operations; the range `for x .. n` is `o->` (codecycle).
### Task 16: Write section 4 Tier 2 (data pipeline)
@@ -545,7 +545,7 @@ For each verb, the 5-column table (with one extra column: "maps to mcp_client to
- "Borrowed from" note
- SSDL shape tag
Tier 2 SSDL shape tags: `scan` is `[I]`, `filter`/`map` are `===>` (codepath) or `o==>` (codecycle), `arena { }` is `o==>` (codecycle), `pipe` is `===>W===>` (wide codepath).
Tier 2 SSDL shape tags: `scan` is `[I]`, `filter`/`map` are `->` (codepath) or `o->` (codecycle), `arena { }` is `o->` (codecycle), `pipe` is `=>` (wide codepath).
### Task 17: Write section 4 Tier 3 (shell)
@@ -558,7 +558,7 @@ Per spec §3.4 Tier 3, the verbs are: `exec`, `open`, `read`, `write`, `close`,
For each verb, the 5-column table (with "maps to mcp_client tool" and "maps to shell_runner" columns).
Tier 3 SSDL shape tags: most are `[I]` (single instruction); `wait`/`poll` are `o==>` (codecycle, blocking or polling).
Tier 3 SSDL shape tags: most are `[I]` (single instruction); `wait`/`poll` are `o->` (codecycle, blocking or polling).
### Task 18: Write section 4 Tier 4 (AI-fuzzing tolerance)
@@ -579,7 +579,7 @@ This is the **novel tier** — give it extra space. For each verb:
- "Borrowed from" note
- SSDL shape tag
Tier 4 SSDL shape tags: most are `[I]` (single instruction); `try { ... } recover { ... }` is `===>B===>` (codepath with branch); `sandbox { ... }` is `o==>` (codecycle, the IEventTarget boundary); `assumewide` is `===>W===>` (wide codepath assumption).
Tier 4 SSDL shape tags: most are `[I]` (single instruction); `try { ... } recover { ... }` is `->B->` (codepath with branch); `sandbox { ... }` is `o->` (codecycle, the IEventTarget boundary); `assumewide` is `=>` (wide codepath assumption).
### Task 19: Write section 5 (hardware mapping)
@@ -150,10 +150,10 @@ The detailed analysis for each cluster lives in the research sub-reports at `res
| # | Shape | One-line definition | SSDL symbol |
|---|---|---|---|
| 1 | **Instruction** | A single unit of computation. Reads data, writes data, or both. | `[I]` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `===>` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `===>W===>` |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o==>` |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `oo==>oo` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `->` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `=>` |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o->` |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `o=>` |
| 6 | **Codecycle graph** | Multiple codecycles + the data they read and write. | `boxes + arrows` |
**The 7 modifiers:**
@@ -168,7 +168,7 @@ The detailed analysis for each cluster lives in the research sub-reports at `res
| `[N]` | nil sentinel | A special value that satisfies "is this OK to use?" in all cases |
| `───` | data | A line representing data being read or written (not a codepath) |
**How the DSL uses SSDL tags.** Each verb in §4 has a "Shape" column with an SSDL tag. For example, `sum` is `[I]` (single instruction); `for x .. n` is `o==>` (codecycle); `arena { }` is a sub-codepath scope; `pipe` is `===>W===>` (wide codepath, the chain can fan out); the entire DSL pipeline is a codecycle graph (multiple codecycles + the data they read and write). This lets the reader see the *shape* of a pipeline at a glance.
**How the DSL uses SSDL tags.** Each verb in §4 has a "Shape" column with an SSDL tag. For example, `sum` is `[I]` (single instruction); `for x .. n` is `o->` (codecycle); `arena { }` is a sub-codepath scope; `pipe` is `=>` (wide codepath, the chain can fan out); the entire DSL pipeline is a codecycle graph (multiple codecycles + the data they read and write). This lets the reader see the *shape* of a pipeline at a glance.
### Cluster 6 — Project's Own Command DSL Precedents
@@ -315,7 +315,7 @@ The Tier 1 verbs are drawn directly from the user's math pseudocode.
|---|---|---|---|---|---|---|
| `:=` | Local bind | `name := expr` | Stack-scoped local declaration | `result := Matrix(m.rows -1, m.columns -1)` | Forth (dictionary entries); Joy (quotations) | `[I]` |
| `stack { ... }` | Stack scope | `stack { decl1; decl2; ... }` | Block of stack-allocated locals | `stack { result := ...; row_offset, col_offset := Scalar; }` | Forth (colon definitions); KYRA (basic blocks) | `[I]` |
| `for x .. n` | Range iteration | `for x .. n { body }` | Iterate `x` over `[0, n)` | `for col .. m.columns` | APL `ιN`; K `!R`; BQN `↕N`; Uiua (stack iteration) | `o==>` |
| `for x .. n` | Range iteration | `for x .. n { body }` | Iterate `x` over `[0, n)` | `for col .. m.columns` | APL `ιN`; K `!R`; BQN `↕N`; Uiua (stack iteration) | `o->` |
| `+` | Add | `a + b` | Element-wise sum | `2 + 3` (yields 5) | All languages | `[I]` |
| `-` | Subtract | `a - b` | Element-wise difference | `5 - 2` (yields 3) | All languages | `[I]` |
| `*` | Multiply | `a * b` | Element-wise product | `2 * 3` (yields 6) | All languages | `[I]` |
@@ -335,17 +335,17 @@ The Tier 2 verbs wrap the existing 45+ MCP tools (per `docs/guide_tools.md` §"N
| Symbol | Name | Signature | Semantics | Example | Maps to mcp_client tool | Borrowed from | Shape |
|---|---|---|---|---|---|---|---|
| `scan` | Scan | `scan path` | Read source (directory, file, URL); first verb in every pipeline | `scan "src/" -> filter !dir -> map ext` | `list_directory` + `search_files` + `read_file` | Jofito `scandir()` | `[I]` |
| `select` | Select | `select condition` | Keep records matching condition (jq-style filter) | `scan "src/" -> select .extension == ".py"` | (jq-style filter) | jq `select(condition)`; Joy `filter` | `===>` |
| `filter` | Filter | `filter predicate` | Keep records where predicate is true | `scan "src/" -> filter .size > 0` | (predicate on FileItem) | Jofito `{filter ...}` predicate | `===>` |
| `map` | Map | `map block` | Apply block to each record | `scan "src/" -> map ext` | (no direct equivalent) | jq `.[] | .field`; Joy `map`; CoSy `' verb 'm` | `o==>` |
| `fold` | Fold | `fold init block` | Reduce to single value | `scan "src/" -> fold 0 { acc + .size }` | (no direct equivalent) | jq `reduce`; Joy `fold` | `o==>` |
| `select` | Select | `select condition` | Keep records matching condition (jq-style filter) | `scan "src/" -> select .extension == ".py"` | (jq-style filter) | jq `select(condition)`; Joy `filter` | `->` |
| `filter` | Filter | `filter predicate` | Keep records where predicate is true | `scan "src/" -> filter .size > 0` | (predicate on FileItem) | Jofito `{filter ...}` predicate | `->` |
| `map` | Map | `map block` | Apply block to each record | `scan "src/" -> map ext` | (no direct equivalent) | jq `.[] | .field`; Joy `map`; CoSy `' verb 'm` | `o->` |
| `fold` | Fold | `fold init block` | Reduce to single value | `scan "src/" -> fold 0 { acc + .size }` | (no direct equivalent) | jq `reduce`; Joy `fold` | `o->` |
| `sort` | Sort | `sort key` | Order records by key | `scan "src/" -> sort .name` | (no direct equivalent) | Joy `qsort`; jq `sort` | `[I]` |
| `group` | Group | `group key` | Bucket records by key | `scan "src/" -> group .extension` | (no direct equivalent) | jq `group_by`; CoSy APL-derived | `o==>` |
| `group` | Group | `group key` | Bucket records by key | `scan "src/" -> group .extension` | (no direct equivalent) | jq `group_by`; CoSy APL-derived | `o->` |
| `dedupe` | Dedupe | `dedupe` | Remove duplicates | `scan "src/" -> dedupe` | (no direct equivalent) | jq `unique`; CoSy | `[I]` |
| `arena { }` | Arena scope | `arena { body }` | Tape-drive region; pre-scatter contents | `arena { [ scan ]; [ filter ]; [ print ] }` | (compiler directive) | KYRA magenta pipe; Onat preemptive scatter | `o==>` |
| `scatter` | Scatter | `scatter workers` | Fork pipeline across `workers` cores | `scan "src/" -> scatter 4 -> filter` | (runtime hint) | Onat preemptive scatter; Lottes X.com thread line 55-61 | `===>W===>` |
| `arena { }` | Arena scope | `arena { body }` | Tape-drive region; pre-scatter contents | `arena { [ scan ]; [ filter ]; [ print ] }` | (compiler directive) | KYRA magenta pipe; Onat preemptive scatter | `o->` |
| `scatter` | Scatter | `scatter workers` | Fork pipeline across `workers` cores | `scan "src/" -> scatter 4 -> filter` | (runtime hint) | Onat preemptive scatter; Lottes X.com thread line 55-61 | `=>` |
| `gather` | Gather | `gather` | Collect scattered sub-streams | `scan "src/" -> scatter 4 -> filter -> gather` | (runtime hint) | Onat inverse of scatter | `[I]` |
| `pipe` | Pipe root | `pipe` | Explicit chain root (synonym for `->`) | `pipe [ scan, filter, print ]` | (no direct equivalent) | Jofito pipe coalescing (transcript:376-410) | `===>W===>` |
| `pipe` | Pipe root | `pipe` | Explicit chain root (synonym for `->`) | `pipe [ scan, filter, print ]` | (no direct equivalent) | Jofito pipe coalescing (transcript:376-410) | `=>` |
**Total Tier 2: 12 verbs.**
@@ -362,8 +362,8 @@ The Tier 3 verbs wrap existing MCP tools (per `docs/guide_tools.md` §"Native To
| `close` | Close | `close handle` | Close handle | `close file_handle` | (no direct equivalent; close is implicit in Python) | Forth `CLOSE-FILE`; bash `exec` | `[I]` |
| `path` | Path | `path` | Get current path (or `cd`) | `path` | (no direct equivalent; use `cwd`) | shell `pwd`; CoSy `path` | `[I]` |
| `env` | Env | `env var` | Get env var | `env HOME` | (no direct equivalent) | shell `echo $HOME` | `[I]` |
| `wait` | Wait | `wait ms` | Block for `ms` milliseconds | `wait 1000` | (no direct equivalent) | shell `sleep` | `o==>` |
| `poll` | Poll | `poll handle ms` | Poll handle with timeout | `poll file_handle 5000` | (no direct equivalent) | shell `read -t` | `o==>` |
| `wait` | Wait | `wait ms` | Block for `ms` milliseconds | `wait 1000` | (no direct equivalent) | shell `sleep` | `o->` |
| `poll` | Poll | `poll handle ms` | Poll handle with timeout | `poll file_handle 5000` | (no direct equivalent) | shell `read -t` | `o->` |
| `cwd` | CWD | `cwd` | Get current working directory | `cwd` | (no direct equivalent) | shell `pwd` | `[I]` |
**Total Tier 3: 10 verbs.**
@@ -374,14 +374,14 @@ The Tier 4 verbs are what make the DSL workable for AI agents that may fuzz verb
| Symbol | Name | Signature | Semantics | Example | Novel piece | Borrowed from | Shape |
|---|---|---|---|---|---|---|---|
| `fuzzy` | Fuzzy | `fuzzy expr` | Declare a parse-tolerance region; parser accepts near-matches | `fuzzy { scan "src/" -> filter .ext }` | Tolerance for AI verb-name fuzzing | nagent "discovery" intent (per `decisions.md:119,128`); SSDL "assume as much as possible" | `===>` |
| `try { ... } recover { ... }` | Try / Recover | `try { body } recover err { fallback }` | Returns `Result[T]`; on error, the `recover` block runs | `try { read "src/foo.py" } recover { read "src/Foo.py" }` | Error envelope as data (Fleury pattern) | `data_oriented_error_handling_20260606`; Wasm `try`/`catch` block/loop/if/end | `===>B===>` |
| `sandbox { ... }` | Sandbox | `sandbox { body }` | IEventTarget boundary; all writes in the block go through the formal event channel | `sandbox { write "tmp/x" "data" }` | O'Donnell's "reads free, writes formalized" invariant applied to the DSL | O'Donnell `mvc.html` "Writing to Model state" | `o==>` |
| `fuzzy` | Fuzzy | `fuzzy expr` | Declare a parse-tolerance region; parser accepts near-matches | `fuzzy { scan "src/" -> filter .ext }` | Tolerance for AI verb-name fuzzing | nagent "discovery" intent (per `decisions.md:119,128`); SSDL "assume as much as possible" | `->` |
| `try { ... } recover { ... }` | Try / Recover | `try { body } recover err { fallback }` | Returns `Result[T]`; on error, the `recover` block runs | `try { read "src/foo.py" } recover { read "src/Foo.py" }` | Error envelope as data (Fleury pattern) | `data_oriented_error_handling_20260606`; Wasm `try`/`catch` block/loop/if/end | `->B->` |
| `sandbox { ... }` | Sandbox | `sandbox { body }` | IEventTarget boundary; all writes in the block go through the formal event channel | `sandbox { write "tmp/x" "data" }` | O'Donnell's "reads free, writes formalized" invariant applied to the DSL | O'Donnell `mvc.html` "Writing to Model state" | `o->` |
| `audit` | Audit | `audit msg` | Log the state change to a structured record; the IEventTarget itself | `audit "wrote tmp/x"` | Per-write audit log; full replay capability | O'Donnell `mvc.html` "Event callbacks"; nagent's self-describing tools | `[I]` |
| `didyoumean` | Did you mean | `didyoumean ambiguous` | Propose the closest matching verb(s) for an ambiguous input | `didyoumean "skan"` | Recovery primitive for AI typos | nagent Bridge DSL intent model; Anthropic `input_examples` | `[I]` |
| `span` | Span | `span intent` | Decompose a compound intent into a span of sub-MCP grammar tokens | `span "read foo.py:MyClass"` | Spans the `read_file` and `py_get_definition` tools | MCP DSL per-MCP grammar (`spec.md:456-465`); OpenAI namespace grouping | `[I]` |
| `offset` | Offset | `offset symbol` | Resolve a symbol to a file:line without requiring the model to specify the line | `offset "foo.py:MyClass.method"` | Implicit offset resolution | MCP DSL line-range notation; OpenAI "don't make the model fill known args" | `[Q]` |
| `assumewide` | Assume wide | `assumewide intent` | If the intent is broad or ambiguous, select the most-capable matching tool (the "fewer, more capable" heuristic) | `assumewide "refactor"` | Prefer broad-capability tools over narrow specialists | OpenAI "fewer than 20 functions"; Anthropic `tool_choice: tool` force-call | `===>W===>` |
| `assumewide` | Assume wide | `assumewide intent` | If the intent is broad or ambiguous, select the most-capable matching tool (the "fewer, more capable" heuristic) | `assumewide "refactor"` | Prefer broad-capability tools over narrow specialists | OpenAI "fewer than 20 functions"; Anthropic `tool_choice: tool` force-call | `=>` |
**Total Tier 4: 8 verbs.**
@@ -154,10 +154,10 @@ The detailed analysis for each cluster lives in the research sub-reports at `res
| # | Shape | One-line definition | SSDL symbol |
|---|---|---|---|
| 1 | **Instruction** | A single unit of computation. Reads data, writes data, or both. | `[I]` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `===>` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `===>W===>` |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o==>` |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `oo==>oo` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `->` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `=>` |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o->` |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `o=>` |
| 6 | **Codecycle graph** | Multiple codecycles + the data they read and write. | `boxes + arrows` |
**The 7 modifiers:**
@@ -172,7 +172,7 @@ The detailed analysis for each cluster lives in the research sub-reports at `res
| `[N]` | nil sentinel | A special value that satisfies "is this OK to use?" in all cases |
| `───` | data | A line representing data being read or written (not a codepath) |
**How the DSL uses SSDL tags.** Each verb in §4 has a "Shape" column with an SSDL tag. For example, `sum` is `[I]` (single instruction); `for x .. n` is `o==>` (codecycle); `arena { }` is a sub-codepath scope; `pipe` is `===>W===>` (wide codepath, the chain can fan out); the entire DSL pipeline is a codecycle graph (multiple codecycles + the data they read and write). This lets the reader see the *shape* of a pipeline at a glance.
**How the DSL uses SSDL tags.** Each verb in §4 has a "Shape" column with an SSDL tag. For example, `sum` is `[I]` (single instruction); `for x .. n` is `o->` (codecycle); `arena { }` is a sub-codepath scope; `pipe` is `=>` (wide codepath, the chain can fan out); the entire DSL pipeline is a codecycle graph (multiple codecycles + the data they read and write). This lets the reader see the *shape* of a pipeline at a glance.
### Cluster 6 — Project's Own Command DSL Precedents
@@ -319,7 +319,7 @@ The Tier 1 verbs are drawn directly from the user's math pseudocode.
|---|---|---|---|---|---|---|
| `:=` | Local bind | `name := expr` | Stack-scoped local declaration | `result := Matrix(m.rows -1, m.columns -1)` | Forth (dictionary entries); Joy (quotations) | `[I]` |
| `stack { ... }` | Stack scope | `stack { decl1; decl2; ... }` | Block of stack-allocated locals | `stack { result := ...; row_offset, col_offset := Scalar; }` | Forth (colon definitions); KYRA (basic blocks) | `[I]` |
| `for x .. n` | Range iteration | `for x .. n { body }` | Iterate `x` over `[0, n)` | `for col .. m.columns` | APL `ιN`; K `!R`; BQN `↕N`; Uiua (stack iteration) | `o==>` |
| `for x .. n` | Range iteration | `for x .. n { body }` | Iterate `x` over `[0, n)` | `for col .. m.columns` | APL `ιN`; K `!R`; BQN `↕N`; Uiua (stack iteration) | `o->` |
| `+` | Add | `a + b` | Element-wise sum | `2 + 3` (yields 5) | All languages | `[I]` |
| `-` | Subtract | `a - b` | Element-wise difference | `5 - 2` (yields 3) | All languages | `[I]` |
| `*` | Multiply | `a * b` | Element-wise product | `2 * 3` (yields 6) | All languages | `[I]` |
@@ -339,17 +339,17 @@ The Tier 2 verbs wrap the existing 45+ MCP tools (per `docs/guide_tools.md` §"N
| Symbol | Name | Signature | Semantics | Example | Maps to mcp_client tool | Borrowed from | Shape |
|---|---|---|---|---|---|---|---|
| `scan` | Scan | `scan path` | Read source (directory, file, URL); first verb in every pipeline | `scan "src/" -> filter !dir -> map ext` | `list_directory` + `search_files` + `read_file` | Jofito `scandir()` | `[I]` |
| `select` | Select | `select condition` | Keep records matching condition (jq-style filter) | `scan "src/" -> select .extension == ".py"` | (jq-style filter) | jq `select(condition)`; Joy `filter` | `===>` |
| `filter` | Filter | `filter predicate` | Keep records where predicate is true | `scan "src/" -> filter .size > 0` | (predicate on FileItem) | Jofito `{filter ...}` predicate | `===>` |
| `map` | Map | `map block` | Apply block to each record | `scan "src/" -> map ext` | (no direct equivalent) | jq `.[] | .field`; Joy `map`; CoSy `' verb 'm` | `o==>` |
| `fold` | Fold | `fold init block` | Reduce to single value | `scan "src/" -> fold 0 { acc + .size }` | (no direct equivalent) | jq `reduce`; Joy `fold` | `o==>` |
| `select` | Select | `select condition` | Keep records matching condition (jq-style filter) | `scan "src/" -> select .extension == ".py"` | (jq-style filter) | jq `select(condition)`; Joy `filter` | `->` |
| `filter` | Filter | `filter predicate` | Keep records where predicate is true | `scan "src/" -> filter .size > 0` | (predicate on FileItem) | Jofito `{filter ...}` predicate | `->` |
| `map` | Map | `map block` | Apply block to each record | `scan "src/" -> map ext` | (no direct equivalent) | jq `.[] | .field`; Joy `map`; CoSy `' verb 'm` | `o->` |
| `fold` | Fold | `fold init block` | Reduce to single value | `scan "src/" -> fold 0 { acc + .size }` | (no direct equivalent) | jq `reduce`; Joy `fold` | `o->` |
| `sort` | Sort | `sort key` | Order records by key | `scan "src/" -> sort .name` | (no direct equivalent) | Joy `qsort`; jq `sort` | `[I]` |
| `group` | Group | `group key` | Bucket records by key | `scan "src/" -> group .extension` | (no direct equivalent) | jq `group_by`; CoSy APL-derived | `o==>` |
| `group` | Group | `group key` | Bucket records by key | `scan "src/" -> group .extension` | (no direct equivalent) | jq `group_by`; CoSy APL-derived | `o->` |
| `dedupe` | Dedupe | `dedupe` | Remove duplicates | `scan "src/" -> dedupe` | (no direct equivalent) | jq `unique`; CoSy | `[I]` |
| `arena { }` | Arena scope | `arena { body }` | Tape-drive region; pre-scatter contents | `arena { [ scan ]; [ filter ]; [ print ] }` | (compiler directive) | KYRA magenta pipe; Onat preemptive scatter | `o==>` |
| `scatter` | Scatter | `scatter workers` | Fork pipeline across `workers` cores | `scan "src/" -> scatter 4 -> filter` | (runtime hint) | Onat preemptive scatter; Lottes X.com thread line 55-61 | `===>W===>` |
| `arena { }` | Arena scope | `arena { body }` | Tape-drive region; pre-scatter contents | `arena { [ scan ]; [ filter ]; [ print ] }` | (compiler directive) | KYRA magenta pipe; Onat preemptive scatter | `o->` |
| `scatter` | Scatter | `scatter workers` | Fork pipeline across `workers` cores | `scan "src/" -> scatter 4 -> filter` | (runtime hint) | Onat preemptive scatter; Lottes X.com thread line 55-61 | `=>` |
| `gather` | Gather | `gather` | Collect scattered sub-streams | `scan "src/" -> scatter 4 -> filter -> gather` | (runtime hint) | Onat inverse of scatter | `[I]` |
| `pipe` | Pipe root | `pipe` | Explicit chain root (synonym for `->`) | `pipe [ scan, filter, print ]` | (no direct equivalent) | Jofito pipe coalescing (transcript:376-410) | `===>W===>` |
| `pipe` | Pipe root | `pipe` | Explicit chain root (synonym for `->`) | `pipe [ scan, filter, print ]` | (no direct equivalent) | Jofito pipe coalescing (transcript:376-410) | `=>` |
**Total Tier 2: 12 verbs.**
@@ -366,8 +366,8 @@ The Tier 3 verbs wrap existing MCP tools (per `docs/guide_tools.md` §"Native To
| `close` | Close | `close handle` | Close handle | `close file_handle` | (no direct equivalent; close is implicit in Python) | Forth `CLOSE-FILE`; bash `exec` | `[I]` |
| `path` | Path | `path` | Get current path (or `cd`) | `path` | (no direct equivalent; use `cwd`) | shell `pwd`; CoSy `path` | `[I]` |
| `env` | Env | `env var` | Get env var | `env HOME` | (no direct equivalent) | shell `echo $HOME` | `[I]` |
| `wait` | Wait | `wait ms` | Block for `ms` milliseconds | `wait 1000` | (no direct equivalent) | shell `sleep` | `o==>` |
| `poll` | Poll | `poll handle ms` | Poll handle with timeout | `poll file_handle 5000` | (no direct equivalent) | shell `read -t` | `o==>` |
| `wait` | Wait | `wait ms` | Block for `ms` milliseconds | `wait 1000` | (no direct equivalent) | shell `sleep` | `o->` |
| `poll` | Poll | `poll handle ms` | Poll handle with timeout | `poll file_handle 5000` | (no direct equivalent) | shell `read -t` | `o->` |
| `cwd` | CWD | `cwd` | Get current working directory | `cwd` | (no direct equivalent) | shell `pwd` | `[I]` |
**Total Tier 3: 10 verbs.**
@@ -378,14 +378,14 @@ The Tier 4 verbs are what make the DSL workable for AI agents that may fuzz verb
| Symbol | Name | Signature | Semantics | Example | Novel piece | Borrowed from | Shape |
|---|---|---|---|---|---|---|---|
| `fuzzy` | Fuzzy | `fuzzy expr` | Declare a parse-tolerance region; parser accepts near-matches | `fuzzy { scan "src/" -> filter .ext }` | Tolerance for AI verb-name fuzzing | nagent "discovery" intent (per `decisions.md:119,128`); SSDL "assume as much as possible" | `===>` |
| `try { ... } recover { ... }` | Try / Recover | `try { body } recover err { fallback }` | Returns `Result[T]`; on error, the `recover` block runs | `try { read "src/foo.py" } recover { read "src/Foo.py" }` | Error envelope as data (Fleury pattern) | `data_oriented_error_handling_20260606`; Wasm `try`/`catch` block/loop/if/end | `===>B===>` |
| `sandbox { ... }` | Sandbox | `sandbox { body }` | IEventTarget boundary; all writes in the block go through the formal event channel | `sandbox { write "tmp/x" "data" }` | O'Donnell's "reads free, writes formalized" invariant applied to the DSL | O'Donnell `mvc.html` "Writing to Model state" | `o==>` |
| `fuzzy` | Fuzzy | `fuzzy expr` | Declare a parse-tolerance region; parser accepts near-matches | `fuzzy { scan "src/" -> filter .ext }` | Tolerance for AI verb-name fuzzing | nagent "discovery" intent (per `decisions.md:119,128`); SSDL "assume as much as possible" | `->` |
| `try { ... } recover { ... }` | Try / Recover | `try { body } recover err { fallback }` | Returns `Result[T]`; on error, the `recover` block runs | `try { read "src/foo.py" } recover { read "src/Foo.py" }` | Error envelope as data (Fleury pattern) | `data_oriented_error_handling_20260606`; Wasm `try`/`catch` block/loop/if/end | `->B->` |
| `sandbox { ... }` | Sandbox | `sandbox { body }` | IEventTarget boundary; all writes in the block go through the formal event channel | `sandbox { write "tmp/x" "data" }` | O'Donnell's "reads free, writes formalized" invariant applied to the DSL | O'Donnell `mvc.html` "Writing to Model state" | `o->` |
| `audit` | Audit | `audit msg` | Log the state change to a structured record; the IEventTarget itself | `audit "wrote tmp/x"` | Per-write audit log; full replay capability | O'Donnell `mvc.html` "Event callbacks"; nagent's self-describing tools | `[I]` |
| `didyoumean` | Did you mean | `didyoumean ambiguous` | Propose the closest matching verb(s) for an ambiguous input | `didyoumean "skan"` | Recovery primitive for AI typos | nagent Bridge DSL intent model; Anthropic `input_examples` | `[I]` |
| `span` | Span | `span intent` | Decompose a compound intent into a span of sub-MCP grammar tokens | `span "read foo.py:MyClass"` | Spans the `read_file` and `py_get_definition` tools | MCP DSL per-MCP grammar (`spec.md:456-465`); OpenAI namespace grouping | `[I]` |
| `offset` | Offset | `offset symbol` | Resolve a symbol to a file:line without requiring the model to specify the line | `offset "foo.py:MyClass.method"` | Implicit offset resolution | MCP DSL line-range notation; OpenAI "don't make the model fill known args" | `[Q]` |
| `assumewide` | Assume wide | `assumewide intent` | If the intent is broad or ambiguous, select the most-capable matching tool (the "fewer, more capable" heuristic) | `assumewide "refactor"` | Prefer broad-capability tools over narrow specialists | OpenAI "fewer than 20 functions"; Anthropic `tool_choice: tool` force-call | `===>W===>` |
| `assumewide` | Assume wide | `assumewide intent` | If the intent is broad or ambiguous, select the most-capable matching tool (the "fewer, more capable" heuristic) | `assumewide "refactor"` | Prefer broad-capability tools over narrow specialists | OpenAI "fewer than 20 functions"; Anthropic `tool_choice: tool` force-call | `=>` |
**Total Tier 4: 8 verbs.**
@@ -749,10 +749,10 @@ Per `docs/reports/computational_shapes_ssdl_digest_20260608.md` §1, the SSDL vo
| # | Shape | One-line definition | SSDL symbol |
|---|---|---|---|
| 1 | **Instruction** | A single unit of computation. Reads data, writes data, or both. | `[I]` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `===>` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `===>W===>` |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o==>` |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `oo==>oo` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `->` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `=>` |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o->` |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `o=>` |
| 6 | **Codecycle graph** | Multiple codecycles + the data they read and write. | `boxes + arrows` |
**The 7 modifiers** (full table):
@@ -1080,7 +1080,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- `for col .. m.columns { body }` (per user's pseudocode line 33)
- `for i .. 10 { print i }` (prints 0-9)
- `for i .. arr.size { sum +:= arr[i] }` (sum a vector)
- SSDL shape: `o==>` (codecycle — loops back to first instruction after last)
- SSDL shape: `o->` (codecycle — loops back to first instruction after last)
**`name[a, b, ...]` (Bracket indexing).**
- Signature: `name[i, j, k, ...]`
@@ -1112,7 +1112,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- `sum 1..10` (yields 55; per APL `+/ι10`)
- `product 1..5` (yields 120; per APL `×/ι5`)
- `sum arr` (sum an arbitrary array)
- SSDL shape: `o==>` (codecycle; iterates over elements)
- SSDL shape: `o->` (codecycle; iterates over elements)
**`if cond { then } [else { else }]` (Conditional).**
- Signature: `if expression "{" program "}" [ "else" "{" program "}" ]`
@@ -1143,7 +1143,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `scan "src/" -> select .extension == ".py"`
- `scan "src/" -> select .size > 1024`
- SSDL shape: `===>` (codepath)
- SSDL shape: `->` (codepath)
**`filter predicate` (Keep matching).**
- Signature: `filter predicate`
@@ -1152,7 +1152,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `scan "src/" -> filter .size > 0`
- `scan "src/" -> filter exists`
- SSDL shape: `===>`
- SSDL shape: `->`
**`map block` (Apply to each).**
- Signature: `map block`
@@ -1161,7 +1161,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `scan "src/" -> map ext` (yields list of extensions)
- `scan "src/" -> map { x := .name; "src/" + x }` (full paths)
- SSDL shape: `o==>` (codecycle; iterates over records)
- SSDL shape: `o->` (codecycle; iterates over records)
**`fold init block` (Reduce to single).**
- Signature: `fold init_value block`
@@ -1170,7 +1170,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `scan "src/" -> fold 0 { acc + .size }` (total bytes)
- `scan "src/" -> fold "" { acc + .name + "\n" }` (concatenated names)
- SSDL shape: `o==>`
- SSDL shape: `o->`
**`sort key` (Order).**
- Signature: `sort key`
@@ -1188,7 +1188,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `scan "src/" -> group .extension` (group by file extension)
- `scan "src/" -> group .directory` (group by parent directory)
- SSDL shape: `o==>` (codecycle)
- SSDL shape: `o->` (codecycle)
**`dedupe` (Remove duplicates).**
- Signature: `dedupe`
@@ -1206,7 +1206,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `arena { [ scan ]; [ filter ]; [ print ] }` (3 basic blocks in a tape region)
- `arena { x := 42; y := x * 2; use y }` (local tape)
- SSDL shape: `o==>` (codecycle; the region is a single execution unit)
- SSDL shape: `o->` (codecycle; the region is a single execution unit)
**`scatter workers` (Fork).**
- Signature: `scatter workers_expr`
@@ -1215,7 +1215,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `scan "src/" -> scatter 4 -> filter` (4-way parallel)
- `scan "src/" -> scatter auto -> map` (auto-detect core count)
- SSDL shape: `===>W===>` (wide codepath)
- SSDL shape: `=>` (wide codepath)
**`gather` (Collect).**
- Signature: `gather`
@@ -1232,7 +1232,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `pipe [ scan, filter, print ]` (declarative list form; not the canonical syntax, future extension)
- `pipe` (single token; equivalent to starting a `->` chain)
- SSDL shape: `===>W===>`
- SSDL shape: `=>`
#### A.4.3 Tier 3 — Shell (10 verbs, full reference)
@@ -1305,7 +1305,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `wait 1000` (wait 1 second)
- `wait 50` (wait 50ms; useful for pacing a render loop)
- SSDL shape: `o==>` (codecycle)
- SSDL shape: `o->` (codecycle)
**`poll handle ms` (Poll).**
- Signature: `poll handle_expr ms_expr`
@@ -1313,7 +1313,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Maps to: (no direct equivalent; `shell read -t`)
- Examples:
- `poll file_handle 5000` (poll with 5s timeout)
- SSDL shape: `o==>`
- SSDL shape: `o->`
**`cwd` (Current working dir).**
- Signature: `cwd`
@@ -1332,7 +1332,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `fuzzy { scan "src/" -> filter .ext }` (accepts `skan` as a typo for `scan`)
- `fuzzy { skan "src" }` (accepts the typo)
- SSDL shape: `===>`
- SSDL shape: `->`
**`try { body } recover err { fallback }` (Try / Recover).**
- Signature: `try "{" program "}" "recover" identifier "{" program "}"`
@@ -1341,7 +1341,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `try { read "src/foo.py" } recover { read "src/Foo.py" }` (try capitalized variant)
- `try { read "src/foo.py" -> filter !exists -> print } recover err { audit "scan failed: " + err; return NIL }`
- SSDL shape: `===>B===>` (codepath with branch)
- SSDL shape: `->B->` (codepath with branch)
**`sandbox { body }` (Sandbox).**
- Signature: `sandbox "{" program "}"`
@@ -1350,7 +1350,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `sandbox { write "tmp/x" "data" }` (write goes through HITL approval)
- `sandbox { exec "rm -rf /" }` (destructive exec requires approval)
- SSDL shape: `o==>` (codecycle; the region is an audit unit)
- SSDL shape: `o->` (codecycle; the region is an audit unit)
**`audit msg` (Audit log).**
- Signature: `audit message_expr`
@@ -1393,7 +1393,7 @@ This subsection provides the complete reference for all 42 verbs in the 4 tiers.
- Examples:
- `assumewide "refactor"` (selects the broadest refactor tool)
- `assumewide "find"` (selects a broad search rather than a narrow query)
- SSDL shape: `===>W===>`
- SSDL shape: `=>`
---
@@ -1642,9 +1642,9 @@ That's 4 verbs total, plus the grammar. The placeholder track can demonstrate a
**clusters** — the 8 prior-art groups in §2: 0 (Immediate-Mode Paradigm), 1 (Concatenative), 2 (Array), 3 (Intent-Mapping), 4 (Meta-Tooling DSLs), 5 (SSDL), 6 (Command Palette), 7 (Result convention).
**codepath** (SSDL) — a sequential list of instructions that terminates; no loops. SSDL symbol: `===>`.
**codepath** (SSDL) — a sequential list of instructions that terminates; no loops. SSDL symbol: `->`.
**codecycle** (SSDL) — a circular structure; a codepath that repeats at its first instruction after its last. SSDL symbol: `o==>`.
**codecycle** (SSDL) — a circular structure; a codepath that repeats at its first instruction after its last. SSDL symbol: `o->`.
**DSL** — Domain-Specific Language. In this report, "DSL" refers specifically to the intent-based scripting language proposed in §3 and §4.
@@ -1678,7 +1678,7 @@ That's 4 verbs total, plus the grammar. The placeholder track can demonstrate a
**sandbox** — a Tier 4 verb that declares an IEventTarget boundary. All writes inside `sandbox { ... }` go through the formal event channel (HITL approval).
**SSDL** — Spec/Sketch Description Language, per `docs/reports/computational_shapes_ssdl_digest_20260608.md`. The DSL's verbs are annotated with SSDL shape tags (`[I]`, `===>`, `o==>`, `===>W===>`).
**SSDL** — Spec/Sketch Description Language, per `docs/reports/computational_shapes_ssdl_digest_20260608.md`. The DSL's verbs are annotated with SSDL shape tags (`[I]`, `->`, `o->`, `=>`).
**tag protocol** — nagent's XML-ish self-closing tags for tool invocation. The DSL inherits the *idea* (named operation with typed attributes) but rejects the XML angle-bracket notation.
@@ -1732,7 +1732,7 @@ The bibliography is split into 4 categories: external prior art, project's own r
- **Anthropic tool-use** — `https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/define-tools`. *Key claim:* `input_examples` as a first-class schema field; `strict: true` as a guarantee.
**Cluster 5 — SSDL:**
- **`docs/reports/computational_shapes_ssdl_digest_20260608.md` §1** — (6 primitives + 7 modifiers). *Key claim:* the meta-vocabulary for annotating verb shapes (`[I]`, `===>`, `o==>`, `===>W===>`).
- **`docs/reports/computational_shapes_ssdl_digest_20260608.md` §1** — (6 primitives + 7 modifiers). *Key claim:* the meta-vocabulary for annotating verb shapes (`[I]`, `->`, `o->`, `=>`).
**Cluster 6 — Command Palette:**
- **`docs/guide_command_palette.md`** + **`src/commands.py`** (33 commands). *Key claim:* the user's existing vocabulary instinct; the DSL is a richer superset.
File diff suppressed because it is too large Load Diff
@@ -22,17 +22,17 @@
| # | nagent v2 pattern | Maps to (intent DSL survey) | Manual Slop equivalent | Verdict | Shape | New candidate |
|---|---|---|---|---|---|---|
| 1 | Knowledge harvest (`nagent-gc``~/.nagent/knowledge/`) | §6 Claim 4 (4 memory dimensions) | THIRD memory dimension: curation + discussion + RAG (opt-in) + knowledge | GAP | `o==>` (codecycle: harvest → digest → inject) | **11 (HIGH)** |
| 2 | Prompt caching w/ stable-to-volatile ordering | §6 Claim 5 | `_add_history_cache_breakpoint` + `cache_control` blocks (mechanism present, ordering not enforced); no cache TTL GUI | PARTIAL | `===>M===>` (merge at volatile boundary) | **12a (MED)** |
| 2b | Cache TTL GUI controls | (NEW; no survey claim) | Anthropic ephemeral 5min + Gemini explicit 1h, no GUI | GAP (UX) | `===>W===>` (per-provider control surface) | **12b (MED)** |
| 3 | Conversation compaction (`--compact`) | (NEW; no survey claim) | `run_discussion_compression` = summarize, not compact | GAP | `===>B===>` (try/recover envelope) | **13 (MED)** |
| 1 | Knowledge harvest (`nagent-gc``~/.nagent/knowledge/`) | §6 Claim 4 (4 memory dimensions) | THIRD memory dimension: curation + discussion + RAG (opt-in) + knowledge | GAP | `o->` (codecycle: harvest → digest → inject) | **11 (HIGH)** |
| 2 | Prompt caching w/ stable-to-volatile ordering | §6 Claim 5 | `_add_history_cache_breakpoint` + `cache_control` blocks (mechanism present, ordering not enforced); no cache TTL GUI | PARTIAL | `->M->` (merge at volatile boundary) | **12a (MED)** |
| 2b | Cache TTL GUI controls | (NEW; no survey claim) | Anthropic ephemeral 5min + Gemini explicit 1h, no GUI | GAP (UX) | `=>` (per-provider control surface) | **12b (MED)** |
| 3 | Conversation compaction (`--compact`) | (NEW; no survey claim) | `run_discussion_compression` = summarize, not compact | GAP | `->B->` (try/recover envelope) | **13 (MED)** |
| 4 | Project context files (`context.yaml`) | (no survey claim) | `manual_slop.toml` per-project (TOML ≠ YAML) | PARITY-DIFFERENT-MECHANISM | `[I]` | 14 (LOW) |
| 5 | claude-code provider (5th provider, sub. auth) | (no survey claim) | `_send_gemini_cli` (parallel pattern) | PARITY | `[I]` | none (provider add) |
| 6 | Per-file knowledge notes (`knowledge/files/{file_id}.md`) | §6 Claim 4 (knowledge dim) | `FileItem.notes` absent | GAP | `[I]` | 11.1 (bundle) |
| 7 | "Delete to turn off" feature flags | (no survey claim) | `[ai_settings.toml]` toggles | PARITY-DIFFERENT-MECHANISM | `[I]` | none (styleguide) |
| 8 | Save-with-graceful-summary-failure | §6 Claim 6 (Result[T] envelope) | `run_discussion_compression` failure mode **TBD** | UNKNOWN | `===>B===>` | 15 (TBD) |
| 8 | Save-with-graceful-summary-failure | §6 Claim 6 (Result[T] envelope) | `run_discussion_compression` failure mode **TBD** | UNKNOWN | `->B->` | 15 (TBD) |
| 9 | AGENTS.md `@import` pattern | §6 Claim 1 (Domain = Meta-Tooling) | `AGENTS.md` exists, no canonical rules file | GAP | `[I]` | **16 (HIGH)** |
| 10 | Delegation = context mgmt, not parallelism | §1 Claim 3 (immediate-mode) | MMA subprocess + Context Amnesia (already does this) | PARITY (new framing) | `===>W===>` | none (styleguide) |
| 10 | Delegation = context mgmt, not parallelism | §1 Claim 3 (immediate-mode) | MMA subprocess + Context Amnesia (already does this) | PARITY (new framing) | `=>` | none (styleguide) |
| 11 | RAG integration discipline | (NEW; no survey claim) | `src/rag_engine.py` opt-in; no codified discipline | GAP (doc) | `[I]` | styleguide |
**Headline.** v2.1's 4 memory dimensions and stable-to-volatile cache ordering are now **formally codified** in the intent DSL survey as §6 Claims 4 and 5. The v2.1 review *was the seed* for those survey claims (the survey cites v2.1:50 and v2.1 §2.2 by name). The new styleguides + canonical DOD file proposed in v2.1 §4 should follow the survey's table format (Symbol, Name, Signature, Semantics, Example, Borrowed from, Shape).
@@ -61,9 +61,9 @@ The 4 claims compose: a user expresses intent (Claim 1) using a vocabulary verb
| Dim | Where it lives | What it stores | How edited | How queried | SSDL shape |
|---|---|---|---|---|---|
| Curation | `FileItem` + `ContextPreset` + Fuzzy Anchors | *How to render a file* in the AI's context window | Structural File Editor; project TOML | `aggregate.py:run` at discussion start | `[Q]` |
| Discussion | `app.disc_entries` + branching + UISnapshot | *What was said* in the conversation | GUI `[Edit]` mode; `[Branch]`; undo/redo | `build_markdown` renders as prior context | `o==>` (entries accumulate) |
| Discussion | `app.disc_entries` + branching + UISnapshot | *What was said* in the conversation | GUI `[Edit]` mode; `[Branch]`; undo/redo | `build_markdown` renders as prior context | `o->` (entries accumulate) |
| RAG | `src/rag_engine.py` (ChromaDB) | *Semantic fingerprints* of indexed files | (opaque vector store) | `RAGEngine.search()` at LLM call time | `[Q]` (vector similarity) |
| Knowledge (proposed) | `~/.manual_slop/knowledge/{facts,decisions,questions,playbooks}.md` + `knowledge/files/{file_id}.md` + `knowledge/digest.md` + `knowledge/ledger.json` | *Durable learnings* harvested from past sessions | Plain markdown edit | Bounded digest injected as stable prefix | `o==>` (harvest → digest → inject) |
| Knowledge (proposed) | `~/.manual_slop/knowledge/{facts,decisions,questions,playbooks}.md` + `knowledge/files/{file_id}.md` + `knowledge/digest.md` + `knowledge/ledger.json` | *Durable learnings* harvested from past sessions | Plain markdown edit | Bounded digest injected as stable prefix | `o->` (harvest → digest → inject) |
**The harvest output schema** (was JSON in v2.1 §2.1; now a table per the user's style):
@@ -196,7 +196,7 @@ The proposed GUI surface (a "Caching" tab in Operations Hub):
| nagent v2 | Manual Slop today | Verdict | Shape | Source |
|---|---|---|---|---|
| `--compact` (rewrites conversation preserving structure) | `run_discussion_compression` (summarizes; loses structure) | GAP | `===>B===>` (try/recover envelope) | `bin/nagent:1975-2019` + `prompts/compact-conversation.md` |
| `--compact` (rewrites conversation preserving structure) | `run_discussion_compression` (summarizes; loses structure) | GAP | `->B->` (try/recover envelope) | `bin/nagent:1975-2019` + `prompts/compact-conversation.md` |
**The compaction prompt's self-review checklist** (10 yes/no questions, abbreviated):
@@ -253,7 +253,7 @@ Source: `bin/helpers/nagent_gc_lib.py:regenerate_digest` deletes the file when s
| nagent v2 | Manual Slop today | Verdict | Shape |
|---|---|---|---|
| Save indexes the copy even when summary LLM fails; `(summary unavailable)` marker | `run_discussion_compression` failure mode **TBD** | UNKNOWN | `===>B===>` |
| Save indexes the copy even when summary LLM fails; `(summary unavailable)` marker | `run_discussion_compression` failure mode **TBD** | UNKNOWN | `->B->` |
Cross-reference to intent DSL survey §6 Claim 6: `Result[T]` envelope with side-channel errors. The graceful-failure pattern is the *concrete instance* of the `Result[T]` convention.
@@ -261,7 +261,7 @@ Cross-reference to intent DSL survey §6 Claim 6: `Result[T]` envelope with side
| nagent v2 | Manual Slop today | Verdict | Shape |
|---|---|---|---|
| "Hand off when noisy: distill goal/state/decisions into a sub-conversation prompt, delegate the rest" | MMA worker pool (subprocess + Context Amnesia) | PARITY (new framing) | `===>W===>` (wide: parent + child codepaths) |
| "Hand off when noisy: distill goal/state/decisions into a sub-conversation prompt, delegate the rest" | MMA worker pool (subprocess + Context Amnesia) | PARITY (new framing) | `=>` (wide: parent + child codepaths) |
Source: `bin/nagent:730` (the "Hand off when noisy" line in `build_initial_context`). Update `docs/guide_mma.md` with the new framing; matches intent DSL survey §1 Claim 3 (immediate-mode).
@@ -291,8 +291,8 @@ Each candidate row: Symbol-like ID, Name, Domain, Priority, Effort, Shape, Depen
| # | Name | Domain | Priority | Effort | Shape | Depends on | Cross-refs |
|---|---|---|---|---|---|---|---|
| 1 | `SubConversationRunner` (1:1 sub-convos) | App + MT | HIGH | Med | `===>W===>` | none | survey §6 Claim 1 |
| 2 | RAG pre-staging via sub-convo | App | MED (down) | Sm | `o==>` | 1 | survey §6 Claim 4 (knowledge dim) |
| 1 | `SubConversationRunner` (1:1 sub-convos) | App + MT | HIGH | Med | `=>` | none | survey §6 Claim 1 |
| 2 | RAG pre-staging via sub-convo | App | MED (down) | Sm | `o->` | 1 | survey §6 Claim 4 (knowledge dim) |
| 3 | Stateless `LLMClient` class | App | MED | Lg | `[I]` | none | survey §1 Claim 3 (immediate-mode) |
| 4 | Intent DSL for Meta-Tooling | MT | LOW | research | `[I]` | none | **`intent_dsl_survey_20260612` is the substantiation** |
| 5 | Self-describing MCP tools | BOTH | LOW (subsumed) | Med | `[I]` | `mcp_architecture_refactor` | survey Cluster 4 (Metadesk) |
@@ -301,12 +301,12 @@ Each candidate row: Symbol-like ID, Name, Domain, Priority, Effort, Shape, Depen
| 8 | `py_/ts_c_coedited_files` tools | App | LOW | Sm | `[I]` | 6 | (no survey claim) |
| 9 | Explicit `split_lib.py` / `patch_lib.py` | App | DEFER | Med | `[I]` | none | (no survey claim) |
| 10 | Raw-transcript persistence per Take | App | LOW | Sm | `[I]` | 3 | (no survey claim) |
| **11** | **Knowledge memory (third dimension)** | App | **HIGH** | Lg | `o==>` | `data_oriented_error_handling` | **survey §6 Claim 4** |
| **12a** | Stable-to-volatile cache ordering | App | MED | Sm | `===>M===>` | none | **survey §6 Claim 5** |
| **12b** | Cache TTL GUI controls | App | MED | Med | `===>W===>` | 12a | (no survey claim) |
| **13** | Conversation compaction | App | MED | Sm | `===>B===>` | none | survey §6 Claim 6 (Result envelope) |
| **11** | **Knowledge memory (third dimension)** | App | **HIGH** | Lg | `o->` | `data_oriented_error_handling` | **survey §6 Claim 4** |
| **12a** | Stable-to-volatile cache ordering | App | MED | Sm | `->M->` | none | **survey §6 Claim 5** |
| **12b** | Cache TTL GUI controls | App | MED | Med | `=>` | 12a | (no survey claim) |
| **13** | Conversation compaction | App | MED | Sm | `->B->` | none | survey §6 Claim 6 (Result envelope) |
| **14** | Project context file | App | LOW | Sm | `[I]` | none | (no survey claim) |
| **15** | Save-with-graceful-summary-failure | App | TBD | Sm | `===>B===>` | none | survey §6 Claim 6 |
| **15** | Save-with-graceful-summary-failure | App | TBD | Sm | `->B->` | none | survey §6 Claim 6 |
| **16** | **AGENTS.md `@import` + canonical DOD** | BOTH | **HIGH** | Sm | `[I]` | none | survey §1 (the 4 anchor claims) |
**Net effect.** 16 candidates (up from 10 in v1; up from 11 in v2; up from 12 in v2.1). 4 are HIGH priority (1, 11, 16; + SubConversationRunner). 5 are MEDIUM (2, 3, 6, 12a, 12b, 13). 3 are subsumed/deferred (4, 5, 9). 4 are LOW (7, 8, 10, 14). 1 is TBD (15).
@@ -318,15 +318,15 @@ Each candidate row: Symbol-like ID, Name, Domain, Priority, Effort, Shape, Depen
| # | nagent v2 pattern | Survey cross-ref | Manual Slop equivalent | Verdict | Shape |
|---|---|---|---|---|---|
| 1-5, 10, 12-14 | (v1 rows, mostly unchanged) | ... | ... | ... | ... |
| 3 (editable state) | `--compact`, `--branch-conversation`, editable compaction prompt | §3.5 (try/recover envelope) | Take/branching + per-entry edit + UISnapshot; summarize, not compact | PARITY (DIFF FOCUS) on editing; GAP on compaction | `===>B===>` |
| 3 (editable state) | `--compact`, `--branch-conversation`, editable compaction prompt | §3.5 (try/recover envelope) | Take/branching + per-entry edit + UISnapshot; summarize, not compact | PARITY (DIFF FOCUS) on editing; GAP on compaction | `->B->` |
| 6 (per-file memory) | per-file conversation + per-file knowledge notes | §6 Claim 4 (per-file knowledge) | `FileItem` + `ContextPreset` + Fuzzy Anchors; no `notes` field | PARITY (DIFF KIND) on curation; GAP on notes | `[I]` |
| 9 (sub-convos) | `<nagent-conversation conversation-file="name">` worker reuse; "delegation is context management" | §1 Claim 3 (immediate-mode) | MMA worker pool (subprocess) + 1:1 gap; new framing in docs | PARITY for MMA; GAP for 1:1; design pattern update | `===>W===>` |
| **Knowledge harvest** (NEW) | `nagent-gc``~/.nagent/knowledge/` + provenance + sha256 ledger + digest | **§6 Claim 4** | **THIRD memory dimension** alongside curation + discussion; RAG is opt-in, not the comparison | **GAP (Application)** | `o==>` |
| **Prompt caching strategy** (NEW) | `bin/nagent:970-1014` boundaries; `nagent_llm.py:cache_prefix_blocks` | **§6 Claim 5** | `_add_history_cache_breakpoint`; ordering not enforced; no TTL GUI | **PARTIAL + GAP (UX)** | `===>M===>` |
| **Conversation compaction** (NEW) | `--compact` with editable `prompts/compact-conversation.md` | §3.5 (envelope) | `run_discussion_compression` (summarize, not compact) | **GAP** | `===>B===>` |
| 9 (sub-convos) | `<nagent-conversation conversation-file="name">` worker reuse; "delegation is context management" | §1 Claim 3 (immediate-mode) | MMA worker pool (subprocess) + 1:1 gap; new framing in docs | PARITY for MMA; GAP for 1:1; design pattern update | `=>` |
| **Knowledge harvest** (NEW) | `nagent-gc``~/.nagent/knowledge/` + provenance + sha256 ledger + digest | **§6 Claim 4** | **THIRD memory dimension** alongside curation + discussion; RAG is opt-in, not the comparison | **GAP (Application)** | `o->` |
| **Prompt caching strategy** (NEW) | `bin/nagent:970-1014` boundaries; `nagent_llm.py:cache_prefix_blocks` | **§6 Claim 5** | `_add_history_cache_breakpoint`; ordering not enforced; no TTL GUI | **PARTIAL + GAP (UX)** | `->M->` |
| **Conversation compaction** (NEW) | `--compact` with editable `prompts/compact-conversation.md` | §3.5 (envelope) | `run_discussion_compression` (summarize, not compact) | **GAP** | `->B->` |
| **Project context files** (NEW) | `context.yaml` at git toplevel, install → project → root | (no survey claim) | `manual_slop.toml` per-project (TOML ≠ YAML) | **PARITY (DIFF MECH)** | `[I]` |
| **AGENTS.md `@import`** (NEW) | nagent `CLAUDE.md``context/data-oriented-design.md` | **§1 (the 4 anchor claims)** | `AGENTS.md` exists, no canonical rules file; `./docs/AGENTS.md` not created | **GAP** | `[I]` |
| **Cache TTL exposure** (NEW) | (n/a — providers do this) | (no survey claim) | Anthropic 5min ephemeral + Gemini 1h explicit, no GUI | **GAP (UX)** | `===>W===>` |
| **Cache TTL exposure** (NEW) | (n/a — providers do this) | (no survey claim) | Anthropic 5min ephemeral + Gemini 1h explicit, no GUI | **GAP (UX)** | `=>` |
| **RAG integration discipline** (NEW) | (n/a — nagent has no RAG) | (no survey claim) | `src/rag_engine.py` opt-in; no codified discipline | **GAP (doc)** | `[I]` |
---
@@ -7,7 +7,7 @@
> **Reading guide.** This is a self-contained review of the latest nagent corpus. The 14 patterns from the README (the teaching-arc structure: build → rename → own → exploit → name → apply → compare) are covered in §2, one section per pattern. The 8 new commits since 2026-06-08 are catalogued in §1.3 and each new pattern is deep-dived in §3. The harvest pipeline is in §4; the cache strategy in §5; the compaction pattern in §6. Architecture + protocol + file-ops + candidates + artifacts + next-steps + references round out §7-§13.
>
> **Notation.** Tables (no JSON code blocks), SSDL shape tags (`[I]`, `===>`, `o==>`, `===>W===>`, `[B]`, `[M]`, `[N]`, `[Q]`, `[S]`, `[T]`, `───`), forth/array notation (`a b +` for postfix math), file:line citations into both the nagent source and Manual Slop source. Boxes (`+--+--+`, `|...|`) for visual structure. The 7-column "Symbol, Name, Signature, Semantics, Example, Source, Shape" layout is the canonical table format throughout.
> **Notation.** Tables (no JSON code blocks), SSDL shape tags (`[I]`, `->`, `o->`, `=>`, `[B]`, `[M]`, `[N]`, `[Q]`, `[S]`, `[T]`, `───`), forth/array notation (`a b +` for postfix math), file:line citations into both the nagent source and Manual Slop source. Boxes (`+--+--+`, `|...|`) for visual structure. The 7-column "Symbol, Name, Signature, Semantics, Example, Source, Shape" layout is the canonical table format throughout.
>
> **What this is not.** Not a delta on a prior review. Not a comparison table only. The 14 patterns + 12 new additions + 4 deep-dives + 16 future-track candidates + 15+ proposed artifacts are all here, in depth.
@@ -24,23 +24,23 @@ The latest nagent corpus (post-2026-06-08) introduces **knowledge harvest** as a
| # | Pattern | SSDL shape | Manual Slop equivalent | Verdict | New track? |
|---|---|---|---|---|---|
| 1 | Text in, text out | `[I]` | `ai_client.send()` | PARITY | none |
| 2 | Visible output protocol (8 tags) | `===>B===>` | (provider-native function calling) | ARCH-DIFF | none |
| 3 | The loop (append, call, parse, act) | `o==>` | 3 loops (LLM/MMA/App) | PARITY | none |
| 2 | Visible output protocol (8 tags) | `->B->` | (provider-native function calling) | ARCH-DIFF | none |
| 3 | The loop (append, call, parse, act) | `o->` | 3 loops (LLM/MMA/App) | PARITY | none |
| 4 | Tool discovery (`--description`) | `[I]` | `mcp_client.dispatch` (45 tools) | GAP (auto) | (subsumed by `mcp_architecture_refactor`) |
| 5 | You did not build an agent (data is the thing) | (philosophical) | (philosophical — Manual Slop agrees) | PARITY | none |
| 6 | Conversations are editable state | `[I]` | `disc_entries` + branching + UISnapshot | PARITY-DIFF-FOCUS | none |
| 7 | Repository history as data | `[I]` | `aggregate.py` diff injection; no git history | PARTIAL | 6 (MED) |
| 8 | Harvest knowledge, reclaim space | `o==>` | (absent) | **GAP (Application)** | **11 (HIGH)** |
| 8 | Harvest knowledge, reclaim space | `o->` | (absent) | **GAP (Application)** | **11 (HIGH)** |
| 9 | Everything else files buy you | (lens) | (lens) | N/A | (no track) |
| 10 | Data-oriented design (named principles) | (philosophical) | (philosophical — Manual Slop agrees) | PARITY | none |
| 11 | Artifact neighborhoods | `[I]` | (no coedit tool) | GAP | 8 (LOW) |
| 12 | Managing context + large files | `[I]` | `aggregate.py` + tree-sitter + per-file slices | PARITY-DIFF-MECH | 9 (DEFER) |
| 13 | Per-file write conversations | `[I]` | (per-file discussion memory absent) | PARTIAL | 7 (LOW) |
| 14 | Own the inputs (vs framework abstractions) | (lens) | (lens) | N/A | (no track) |
| **NEW** | **Knowledge harvest** (`nagent-gc`) | `o==>` | (absent) | **GAP** | **11 (HIGH)** |
| **NEW** | **Stable-to-volatile cache ordering** | `===>M===>` | (mechanism present, ordering not enforced) | **PARTIAL** | **12a (MED)** |
| **NEW** | **Cache TTL GUI controls** | `===>W===>` | (no GUI for TTL) | **GAP (UX)** | **12b (MED)** |
| **NEW** | **Conversation compaction** | `===>B===>` | (have summarize, not compact) | **GAP** | **13 (MED)** |
| **NEW** | **Knowledge harvest** (`nagent-gc`) | `o->` | (absent) | **GAP** | **11 (HIGH)** |
| **NEW** | **Stable-to-volatile cache ordering** | `->M->` | (mechanism present, ordering not enforced) | **PARTIAL** | **12a (MED)** |
| **NEW** | **Cache TTL GUI controls** | `=>` | (no GUI for TTL) | **GAP (UX)** | **12b (MED)** |
| **NEW** | **Conversation compaction** | `->B->` | (have summarize, not compact) | **GAP** | **13 (MED)** |
| **NEW** | **Project context files** | `[I]` | `manual_slop.toml` (TOML ≠ YAML) | PARITY-DIFF-MECH | 14 (LOW) |
| **NEW** | **claude-code provider** (5th, sub auth) | `[I]` | `_send_gemini_cli` (parallel) | PARITY | none (provider add) |
| **NEW** | **AGENTS.md `@import` pattern** | `[I]` | `AGENTS.md` exists, no canonical file | **GAP** | **16 (HIGH)** |
@@ -49,8 +49,8 @@ The latest nagent corpus (post-2026-06-08) introduces **knowledge harvest** as a
| # | Candidate | Pri | Effort | Shape |
|---|---|---|---|---|
| 1 | `SubConversationRunner` (1:1 sub-convos) | HIGH | Med | `===>W===>` |
| 2 | RAG pre-staging via sub-convo | MED (down) | Sm | `o==>` |
| 1 | `SubConversationRunner` (1:1 sub-convos) | HIGH | Med | `=>` |
| 2 | RAG pre-staging via sub-convo | MED (down) | Sm | `o->` |
| 3 | Stateless `LLMClient` class | MED | Lg | `[I]` |
| 4 | Intent DSL for Meta-Tooling | LOW | research | `[I]` |
| 5 | Self-describing MCP tools | LOW (subsumed) | Med | `[I]` |
@@ -59,12 +59,12 @@ The latest nagent corpus (post-2026-06-08) introduces **knowledge harvest** as a
| 8 | `py_/ts_c_coedited_files` tools | LOW | Sm | `[I]` |
| 9 | Explicit `split_lib.py` / `patch_lib.py` | DEFER | Med | `[I]` |
| 10 | Raw-transcript persistence per Take | LOW | Sm | `[I]` |
| **11** | **Knowledge memory (3rd dimension)** | **HIGH** | Lg | `o==>` |
| **12a** | **Stable-to-volatile cache ordering** | MED | Sm | `===>M===>` |
| **12b** | **Cache TTL GUI controls** | MED | Med | `===>W===>` |
| **13** | **Conversation compaction** | MED | Sm | `===>B===>` |
| **11** | **Knowledge memory (3rd dimension)** | **HIGH** | Lg | `o->` |
| **12a** | **Stable-to-volatile cache ordering** | MED | Sm | `->M->` |
| **12b** | **Cache TTL GUI controls** | MED | Med | `=>` |
| **13** | **Conversation compaction** | MED | Sm | `->B->` |
| **14** | Project context file | LOW | Sm | `[I]` |
| **15** | Save-with-graceful-summary-failure | TBD | Sm | `===>B===>` |
| **15** | Save-with-graceful-summary-failure | TBD | Sm | `->B->` |
| **16** | **AGENTS.md `@import` + canonical DOD** | **HIGH** | Sm | `[I]` |
### 0.4 The proposed new artifacts (15+ files)
@@ -322,7 +322,7 @@ The 4 substantive commits are #1, #2, #6, #4. Commits #3, #5, #7, #8 are compani
**Verdict.** **ARCHITECTURAL DIFFERENCE** — the Application's choice is correct (parallel tool calls, JSON-mode constraints, native tool calling). The Meta-Tooling could legitimately use nagent's regex-tag protocol for its own work (per the `mcp_architecture_refactor_20260606` track's intent-based DSL placeholder, now substantively specced by the related `intent_dsl_survey_20260612` report). See §3.1 of that report (out of scope here).
**SSDL shape.** `===>B===>` (codepath with branch; the parser branches on tag name).
**SSDL shape.** `->B->` (codepath with branch; the parser branches on tag name).
**Manual Slop next steps.**
- The new `mcp_architecture_refactor_20260606` sub-MCP extraction (already in plan) is the natural place to consider a tag-style protocol for the Meta-Tooling DSL.
@@ -382,7 +382,7 @@ loop:
**Verdict.** **PARITY.** All three loops have the same shape (append, call, parse, act, repeat) but different data structures. nagent's `run_agent_loop` is ~50 lines, easy to reason about. Manual Slop's loops are 100-300 lines each, scattered.
**SSDL shape.** `o==>` (codecycle; the loop repeats).
**SSDL shape.** `o->` (codecycle; the loop repeats).
**Manual Slop next steps.**
- Candidate 3 (Stateless `LLMClient` class) would unify these three loops behind a single `run_loop(...)` function. Large refactor; not high priority.
@@ -636,7 +636,7 @@ Step-by-step history:
**Verdict.** **GAP (Application).** The "knowledge memory" dimension is missing. Curation (FileItem + ContextPreset) and discussion (disc_entries + branching + UISnapshot) are present and strong. RAG is opt-in and is the wrong shape for "what did we learn from past sessions."
**SSDL shape.** `o==>` (codecycle: scan → distill → append → digest → reclaim).
**SSDL shape.** `o->` (codecycle: scan → distill → append → digest → reclaim).
**Manual Slop next steps.**
- **Candidate 11: Knowledge memory (third dimension)** — HIGH priority. The single most important v2.3 finding. See §4 below for the deep-dive.
@@ -1319,7 +1319,7 @@ What's NOT explicit:
**Verdict.** **PARTIAL.** Mechanism present; ordering not enforced; TTL not exposed.
**SSDL shape.** `===>M===>` (merge at volatile boundary).
**SSDL shape.** `->M->` (merge at volatile boundary).
**Manual Slop next steps.**
- **Candidate 12a: Stable-to-volatile cache ordering** — refactor `src/ai_client.py:_get_combined_system_prompt` and the Anthropic call site to enforce the ordering. See §5 below.
@@ -1375,7 +1375,7 @@ What's NOT explicit:
**Verdict.** **GAP (UX).** The mechanism is in place for Anthropic + Gemini; the GUI exposure is missing.
**SSDL shape.** `===>W===>` (wide: per-provider control surface; the same code path branches into 5+ provider-specific config UIs).
**SSDL shape.** `=>` (wide: per-provider control surface; the same code path branches into 5+ provider-specific config UIs).
**Manual Slop next steps.**
- **Candidate 12b: Cache TTL GUI controls** — MEDIUM priority. See §5 below for the deep-dive.
@@ -1593,7 +1593,7 @@ The 12-section output structure is NOT enforced. The failure mode is graceful (t
**Verdict.** **GAP.** Manual Slop has summarization; it does not have behavior-preserving compaction. The 10-question self-review is a contract that the existing `run_discussion_compression` lacks.
**SSDL shape.** `===>B===>` (codepath with branch — the compaction is one of two paths: `try { compact } recover { audit_failure }`).
**SSDL shape.** `->B->` (codepath with branch — the compaction is one of two paths: `try { compact } recover { audit_failure }`).
**Manual Slop next steps.**
- **Candidate 13: Conversation compaction** — MEDIUM priority. See §6 below for the deep-dive.
@@ -2167,7 +2167,7 @@ if knowledge_digest:
**Verdict.** **UNKNOWN** without reading the source. The pattern is the same; the implementation detail is what matters.
**SSDL shape.** `===>B===>` (codepath with branch — the summary is one of two paths: `try { summarize } recover { mark_unavailable }`).
**SSDL shape.** `->B->` (codepath with branch — the summary is one of two paths: `try { summarize } recover { mark_unavailable }`).
**Manual Slop next steps.**
- **Candidate 15: Save-with-graceful-summary-failure** — TBD. The verification (read `src/ai_client.py:run_discussion_compression`) is cheap (one source read); the potential value is high (latent bug).
@@ -2216,7 +2216,7 @@ But the 1:1 discussion path has no sub-agent primitive. The user types a prompt,
**Verdict.** **PARITY for MMA; GAP for 1:1 discussions.** MMA does it right; 1:1 needs the primitive.
**SSDL shape.** `===>W===>` (wide codepath: parent + child codepaths run in parallel; the child is disposable; the parent gets a concise result).
**SSDL shape.** `=>` (wide codepath: parent + child codepaths run in parallel; the child is disposable; the parent gets a concise result).
**Manual Slop next steps.**
- **Candidate 1: `SubConversationRunner`** — HIGH priority. The MMA pattern as a reusable App-callable class. See §10.
@@ -4124,19 +4124,19 @@ The full candidate list, in priority order, with full specifications. This secti
| # | Symbol-like ID | Name | Domain | Pri | Effort | Shape | Depends on |
|---|---|---|---|---|---|---|---|
| 1 | `SubConversationRunner` | 1:1 sub-convos | App + MT | HIGH | Med | `===>W===>` | none |
| 2 | `RAGPreStager` | RAG pre-staging via sub-convo | App | MED | Sm | `o==>` | 1 |
| 1 | `SubConversationRunner` | 1:1 sub-convos | App + MT | HIGH | Med | `=>` | none |
| 2 | `RAGPreStager` | RAG pre-staging via sub-convo | App | MED | Sm | `o->` | 1 |
| 3 | `LLMClient` (stateless) | Stateless LLMClient class | App | MED | Lg | `[I]` | none |
| 4 | `IntentDSL` | Intent DSL for Meta-Tooling | MT | LOW | research | `[I]` | none |
| 5 | `SelfDescribingTools` | Self-describing MCP tools | BOTH | LOW (subsumed) | Med | `[I]` | `mcp_architecture_refactor` |
| 6 | `GitHistory` | `src/git_history.py` (nagent §7) | App | MED | Med | `[I]` | none |
| 7 | `PerFileConversation` | Per-file conversation log | App | LOW | Sm | `[I]` | 3 |
| **8** | `KnowledgeMemory` | **Knowledge memory (3rd dimension)** | **App** | **HIGH** | **Lg** | **`o==>`** | **`data_oriented_error_handling`** |
| **9** | `CacheOrdering` | **Stable-to-volatile cache ordering** | **App** | **MED** | **Sm** | **`===>M===>`** | **none** |
| **10** | `CacheTTL` | **Cache TTL GUI controls** | **App** | **MED** | **Med** | **`===>W===>`** | **9** |
| **11** | `Compaction` | **Conversation compaction** | **App** | **MED** | **Sm** | **`===>B===>`** | **none** |
| **8** | `KnowledgeMemory` | **Knowledge memory (3rd dimension)** | **App** | **HIGH** | **Lg** | **`o->`** | **`data_oriented_error_handling`** |
| **9** | `CacheOrdering` | **Stable-to-volatile cache ordering** | **App** | **MED** | **Sm** | **`->M->`** | **none** |
| **10** | `CacheTTL` | **Cache TTL GUI controls** | **App** | **MED** | **Med** | **`=>`** | **9** |
| **11** | `Compaction` | **Conversation compaction** | **App** | **MED** | **Sm** | **`->B->`** | **none** |
| **12** | `ProjectContext` | Project context file | App | LOW | Sm | `[I]` | none |
| **13** | `GracefulSave` | Save-with-graceful-summary-failure | App | TBD | Sm | `===>B===>` | none |
| **13** | `GracefulSave` | Save-with-graceful-summary-failure | App | TBD | Sm | `->B->` | none |
| **14** | `AGENTSImport` | **AGENTS.md `@import` + canonical DOD** | **BOTH** | **HIGH** | **Sm** | **`[I]`** | **none** |
| 15 | `RawTranscript` | Raw-transcript persistence per Take | App | LOW | Sm | `[I]` | 3 |
| 16 | `CoeditedFiles` | `py_/ts_c_coedited_files` tools | App | LOW | Sm | `[I]` | 6 |
@@ -4200,9 +4200,9 @@ class SubConversationRunner:
| Dim | Where | SSDL | Status |
|---|---|---|---|
| Curation | `FileItem` + `ContextPreset` + Fuzzy Anchors | `[Q]` | existing, strong |
| Discussion | `disc_entries` + branching + UISnapshot | `o==>` | existing, strong |
| Discussion | `disc_entries` + branching + UISnapshot | `o->` | existing, strong |
| RAG | `src/rag_engine.py` (ChromaDB) | `[Q]` | opt-in |
| Knowledge (proposed) | `~/.manual_slop/knowledge/*.md` + per-file + digest + ledger | `o==>` | NEW |
| Knowledge (proposed) | `~/.manual_slop/knowledge/*.md` + per-file + digest + ledger | `o->` | NEW |
**Where it lives.** Application.
@@ -4600,7 +4600,7 @@ The 15+ new files proposed for the next turn, in the user's preferred data forma
|---|---|
| Format | The 7-column "Symbol, Name, Signature, Semantics, Example, Source, Shape" table where applicable |
| No JSON | JSON code blocks become tables or line-based arrays |
| SSDL | Use `[I]`, `===>`, `o==>`, `===>W===>`, `===>M===>`, `===>B===>`, `[B]`, `[M]`, `[N]`, `[Q]`, `[S]`, `[T]`, `───` |
| SSDL | Use `[I]`, `->`, `o->`, `=>`, `->M->`, `->B->`, `[B]`, `[M]`, `[N]`, `[Q]`, `[S]`, `[T]`, `───` |
| Forth/array notation | `a b +` for postfix math; `name := value` for assignment; `if cond { body }` for control flow |
| Code blocks | With `───` data flow lines and `+--+` boxes for visual structure |
| File:line citations | Both nagent source (`bin/nagent:606-745`) and Manual Slop source (`src/aggregate.py:run`) |
@@ -83,7 +83,7 @@ t_v2_1_review_pending_08 = { status = "pending", commit_sha = "", description =
# v2 and v2.1 are PRESERVED; v2.2 is non-destructive new file
t_v2_2_review_01 = { status = "completed", commit_sha = "", description = "v2.2: read intent_dsl_survey_20260612/report_v1.2.md §1, §3, §4, §5, §6, §7 (~600 lines; 10 prior-art clusters, 4 anchor claims, ~42-verb vocab, 10 AI-Agent Properties)" }
t_v2_2_review_02 = { status = "completed", commit_sha = "", description = "v2.2: applied the user's data-format preferences (table-based, forth/array-like, no JSON) — JSON blocks in v2.1 §2.1 replaced with §4.4 7-column tables (Symbol, Name, Signature, Semantics, Example, Borrowed from, Shape)" }
t_v2_2_review_03 = { status = "completed", commit_sha = "", description = "v2.2: adopted SSDL shape tags ([I], ===>, o==>, [B], [M], [N], [Q], [S], ───) for the comparison table and future-track candidate list" }
t_v2_2_review_03 = { status = "completed", commit_sha = "", description = "v2.2: adopted SSDL shape tags ([I], ->, o->, [B], [M], [N], [Q], [S], ───) for the comparison table and future-track candidate list" }
t_v2_2_review_04 = { status = "completed", commit_sha = "", description = "v2.2: cross-referenced the intent DSL survey's 10 AI-Agent Properties (§6 Claims 1-10) — Claims 4 and 5 explicitly cite v2.1 §2.1 and §2.2 as their source" }
t_v2_2_review_05 = { status = "completed", commit_sha = "", description = "v2.2: applied the survey's grammar primitives (name := value, for x .. n, if cond { ... }, tape { ... }, try { ... } recover err { ... }, sandbox { ... }, audit msg, fuzzy { ... }) where applicable" }
t_v2_2_review_06 = { status = "completed", commit_sha = "", description = "v2.2: added new §11 'In dialogue with intent DSL survey' — the 9 mutual cross-references and the 3 the user should know about" }
@@ -38,10 +38,10 @@ A *computation shape* is a high-level concept, not a physical thing. The diagram
| # | Shape | One-line definition | SSDL symbol |
|---|---|---|---|
| 1 | **Instruction** | A single unit of computation. Reads data, writes data, or both. | `[I]` |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `===>` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `===>W===>` (codepaths fan out) |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o==>` (arrow returns to start) |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `oo==>oo` (parallel cycles) |
| 2 | **Codepath** | A sequential list of instructions that *terminates*. No loops. | `->` |
| 3 | **Wide codepath** | A codepath whose execution *causes* several other codepaths to occur simultaneously. | `=>` (codepaths fan out) |
| 4 | **Codecycle** | A circular structure — a codepath that *repeats* at its first instruction after its last. | `o->` (iterator with path) |
| 5 | **Wide codecycle** | Multiple codecycles performing the same task simultaneously. | `o=>` (parallel cycles) |
| 6 | **Codecycle graph** | Multiple codecycles + the data they read and write. | `boxes + arrows` |
**Modifiers** (not shapes, but used to annotate them):
@@ -59,19 +59,19 @@ A *computation shape* is a high-level concept, not a physical thing. The diagram
**Legend**:
```
[I] = single instruction
===> = codepath (linear, terminates at T)
===>W===> = wide codepath (causes parallel codepaths)
o==> = codecycle (loops back to start)
oo==>oo = wide codecycle (parallel codecycles doing the same task)
[T] = terminator (return/exit)
[B] = branch (if/else/switch)
[M] = merge (control flow reconverges)
[S] = state mutation
[Q] = state query
[N] = nil sentinel (defuses branches)
─── = data (read or write)
[•] = codepath that is *defused* (collapses to 1 effective codepath)
[I] = single instruction
-> = codepath (linear, terminates at T)
=> = wide codepath (causes parallel codepaths)
o-> = codecycle (loops back to start)
o=> = wide codecycle (parallel codecycles doing the same task)
[T] = terminator (return/exit)
[B] = branch (if/else/switch)
[M] = merge (control flow reconverges)
[S] = state mutation
[Q] = state query
[N] = nil sentinel (defuses branches)
─── = data (read or write)
[•] = codepath that is *defused* (collapses to 1 effective codepath)
```
---
@@ -242,7 +242,7 @@ USER CODE: SUBSYSTEM:
[T]
```
The user's code is now `===> [T]` (one straight line, one terminator). The subsystem absorbed the branches. **The number of *user-visible* effective codepaths went from 4 to 1.** The total number of codepaths in the program didn't decrease — but the *exposed surface area* did, and that's what matters for the caller's cognitive load, testing burden, and bug surface.
The user's code is now `-> [T]` (one straight line, one terminator). The subsystem absorbed the branches. **The number of *user-visible* effective codepaths went from 4 to 1.** The total number of codepaths in the program didn't decrease — but the *exposed surface area* did, and that's what matters for the caller's cognitive load, testing burden, and bug surface.
#### Technique 4: Immediate-mode API (collapses "did I create/destroy this?" to "no, it's managed for me")
@@ -478,8 +478,8 @@ The 6 primitives + 7 modifiers are enough to sketch any computational shape. The
1. **Top to bottom is time** (instructions happen in order, top first).
2. **`[B]` branches fan out, `[M]` merges reconverge** (control flow).
3. **`[N]` collapses a branch** (the branch exists in the subsystem but not in the user's codepath).
4. **`o==>` means "this is the main loop, it repeats forever"** (codecycle).
5. **`===>W===>` means "this codepath causes parallelism"** (wide).
4. **`o->` means "this is the main loop, it repeats forever"** (codecycle).
5. **`=>` means "this codepath causes parallelism"** (wide).
6. **A subsystem that returns a value valid in all cases** is a black box that the user never has to inspect.
When sketching a feature, *start* with the user's codepath. If it has branches, the question is: "where does the branch live, in user code or in a subsystem?" If the answer is "in a subsystem," sketch the subsystem separately. If the answer is "in user code," *reconsider* — is there a way to push it into a subsystem?
+1 -1
View File
@@ -31,7 +31,7 @@
# Replace the existing "review UX" approach with the ASCII-sketch workflow
# documented in docs/reports/ascii_sketch_ux_workflow_20260608.md
method = "ASCII-sketch + MiniMax understand_image verification"
vocabulary = "[I], ===>, o==>, [B], [M], [S], [Q], [N], --" # 6 primitives + 7 modifiers
vocabulary = "[I], ->, o->, [B], [M], [S], [Q], [N], --" # 6 primitives + 7 modifiers
first_target = "Discussion Hub per-entry panel" # gui_2.py:3770
source_of_truth = "docs/guide_discussions.md §Per-Entry Operations (A1-A7 matrix)"
+1 -1
View File
@@ -222,7 +222,7 @@ Each got ~4 surgical spec edits + See Also cross-references. No plan/task change
### The 5 open questions the report surfaces
1. **Vocabulary preference** — the §2 vocabulary (`[I]`, `===>`, `o==>`, etc.) is a proposal. Alternatives: box-drawing characters (`┌─┐│└─┘`) for more ASCII-art look; Markdown tables for tabular content; hybrid (ASCII boxes for layout, tables for tabular data).
1. **Vocabulary preference** — the §2 vocabulary (`[I]`, `->`, `o->`, etc.) is a proposal. Alternatives: box-drawing characters (`┌─┐│└─┘`) for more ASCII-art look; Markdown tables for tabular content; hybrid (ASCII boxes for layout, tables for tabular data).
2. **Comparison policy** — after locking a design, do we always verify with `MiniMax understand_image` (slow but accurate)? Only when the design uses color/custom drawing? Only when the implementing Tier-3 reports a mismatch?