HS: parenthesized commands and features (+1 test)

Three parser additions so scripts like `(on click (log me) (trigger foo))`
parse into a single feature with both commands in its body:

1. parse-feat: new cond branch for `paren-open` — advance, recurse
   parse-feat, consume `paren-close`. Allows a feature like `(on click
   ...)` to be grouped in parens.

2. parse-cmd: two new cond branches — on `paren-close` return nil (so
   cl-collect terminates at an outer group close), and on `paren-open`
   advance / recurse / close. Allows single parenthesized commands like
   `(log me)`.

3. cl-collect: previously only recursed when the next token was a
   recognised command keyword (`cmd-kw?`), so after `(log me)` the
   sibling `(trigger foo)` would end the feature body and re-surface as
   a top-level feature. Extended the recursion predicate to also fire
   when the next token is `paren-open`.

Suite hs-upstream-core/parser: 9/14 -> 10/14.
Smoke 0-195: 165/195 -> 166/195.
This commit is contained in:
2026-04-24 13:53:36 +00:00
parent 9db703324d
commit d7a88d85ae
4 changed files with 40 additions and 7 deletions

View File

@@ -4,10 +4,10 @@ Live tally for `plans/hs-conformance-to-100.md`. Update after every cluster comm
```
Baseline: 1213/1496 (81.1%)
Merged: 1259/1496 (84.2%) delta +46
Merged: 1260/1496 (84.2%) delta +47
Worktree: all landed
Target: 1496/1496 (100.0%)
Remaining: ~237 tests
Remaining: ~236 tests
```
## Cluster ledger
@@ -45,7 +45,7 @@ Remaining: ~237 tests
| 22 | window global fn fallback | blocked | — | — |
| 23 | `me symbol works in from expressions` | done | +1 | 0d38a75b |
| 24 | `properly interpolates values 2` | done | +1 | cb37259d |
| 25 | parenthesized commands and features | pending | (+1 est) | — |
| 25 | parenthesized commands and features | done | +1 | SHA-PENDING |
### Bucket C — feature stubs (observer mocks)
@@ -86,7 +86,7 @@ Defer until AD drain. Estimated ~25 recoverable tests.
| Bucket | Done | Partial | In-prog | Pending | Blocked | Design-done | Total |
|--------|-----:|--------:|--------:|--------:|--------:|------------:|------:|
| A | 12 | 4 | 0 | 0 | 1 | — | 17 |
| B | 4 | 0 | 0 | 2 | 1 | — | 7 |
| B | 5 | 0 | 0 | 1 | 1 | — | 7 |
| C | 3 | 0 | 0 | 2 | 0 | — | 5 |
| D | 0 | 0 | 0 | 5 | 0 | — | 5 |
| E | 0 | 0 | 0 | 0 | 0 | 5 | 5 |