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:
@@ -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?
|
||||
|
||||
@@ -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)"
|
||||
|
||||
|
||||
@@ -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?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user