Conversation
Every fact about this gem currently lives in a comment, an issue number, or a reviewer's memory. The lode is where it stops being tacit: twenty-two files describing the system as it is, each claim read off the code and cited to the file and method that makes it true. What it holds. Nine subsystem summaries — core and config, component, endpoint, streaming, async and defer, client runtime, tooling, testing and CI, the docs site — plus the root summary's three invariants (signed identity never state, default-deny with the signature not being authorization, pgbus optional and runtime-probed), the terminology this repo actually speaks, and the practices the .claude/rules do not state: capability probes over constant checks, failing at declaration time rather than click time, enumerating once, what may and may not be memoized on the render path. Review rules. Seven files, thirty-seven rules, from two sources. All eight cubic learnings were kept and verified against the current code; ten rules cite one. The merged PR threads on #253, #250, #229, #227, #223, #217 and #210 supplied the rest, including four rejections the author argued down and the reviewer withdrew, recorded as "Not a bug" so the next reviewer does not re-open them. Cubic learnings and their PR-thread twins were merged rather than written twice where they are the same finding seen from both ends. Nothing was dropped: every rule's subject still exists and the code still agrees with it. Twenty-three rules name the spec that proves them; ten say plainly that no automated test covers them — the docs-prose rules, the release-task rules (that task has no test; it is hand-verified against copies of the real lockfiles) and the test-hygiene rules, which are properties of assertions rather than behaviour. The four "Not a bug" entries carry the reasoning instead of a spec. Corrections. Seven claims in the drafted summaries disagreed with the code and were rewritten rather than kept: the loader's exclusions are six ignores plus two do_not_eager_loads, not five; only six settings guard their default with defined? (the rest are ||=, which is safe only because none of those defaults is false); the renderer default is conditional on ActionController::Base being defined; the vendored client is five named files, not every .js in that directory; the ShowConditions parity fixture is not under fixtures/files; and the defer endpoint's rescue chain also lacks the AuthorizationNotVerified clause. Nine doc-versus-code disagreements found along the way are reported separately, not recorded in the lode — a document states only what is true of the tree it ships in. Workflow. lode/workflow.md fills all ten headings from the code, CLAUDE.md, .claude/rules and the local commands this commit retires, so the shared /lode:* skills behave as though written for this repo: the generated client artifacts that must never be hand-merged, the shapes every change is checked against (both servers, both transports, pgbus absent/old/current, a dom-id String as well as a record), and the thirteen reviewer suggestions that are wrong here. Retired: lfg, tdd, plan, github-review-pr, github-review-failures and github-review-comments, superseded by the plugin's. finish-prs and debug-flaky were not present. architect, perf, security and review-pr have no plugin equivalent and stay. CLAUDE.md's command table and model-tier note were updated so neither names a command that no longer exists. Claude-Session: https://claude.ai/code/session_01Hga3idYBp7fWdj7GmmfofF
…rge rule .claude/README.md and SKILL_TEMPLATE.md still taught the retired commands and pointed at a deleted tdd.md; they now name the four local commands and the plugin's entry points. The retired github-review-pr's append-only rule for route files (spec/dummy/config/routes.rb) is restored beside doc.rb in the Conflicts table. Claude-Session: https://claude.ai/code/session_01Hga3idYBp7fWdj7GmmfofF
There was a problem hiding this comment.
4 issues found across 33 files
Confidence score: 5/5
lode/review/client-runtime.mdreports the wrong number of entries and “Not a bug” items, which can mislead reviewers about the runtime findings; update the introductory counts.lode/client-runtime/summary.mdcalls the source edit a three-file change while listing four files, creating inaccurate change documentation; revise the stated file count.lode/workflow.mddocuments arake build:jsfollowed byrake build:js_checksequence even though the check already runs the build, causing redundant minification work; documentrake build:js_checkalone or explain the dependency.CLAUDE.mdretains model-tier guidance forsonnetandhaikuafter the commands pinned to them were retired, leaving stale local contributor guidance; update the paragraph to reflect the remaining commands.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="lode/review/client-runtime.md">
<violation number="1" location="lode/review/client-runtime.md:3">
P3: The intro says "Three of the five entries are *Not a bug*", but this file contains six `###` entries, of which exactly two are `Not a bug` (the connect-time gate posture and the legacy show-attribute arm). Correct the counts to "Two of the six entries". As durable memory the gate and future reviews read, a wrong entry count is misleading.</violation>
</file>
<file name="lode/client-runtime/summary.md">
<violation number="1" location="lode/client-runtime/summary.md:17">
P3: The sentence claims a source edit is a "THREE-file change," but the list it enumerates contains four files: the source, the rebuilt `.min.js`, the rebuilt `.map`, and the re-synced vendored copy. Since this lode memory is meant to be precise (and every other count in it was computed and verified), name it four files rather than three.</violation>
</file>
<file name="lode/workflow.md">
<violation number="1" location="lode/workflow.md:17">
P3: `rake build:js_check` already depends on `rake build:js`, so the documented `rake build:js`, then `rake build:js_check` sequence runs the bun minify build twice. Document `rake build:js_check` alone (or note that js_check is the rebuild+verify step).</violation>
</file>
<file name="CLAUDE.md">
<violation number="1" location="CLAUDE.md:104">
P3: The model-tier paragraph still describes `sonnet` ("prescriptive pattern-following passes") and `haiku` ("mechanical/config work") even though this PR retires the only commands pinned to them. The remaining local commands (`/architect`, `/perf`, `/security`, `/review-pr`) are all `model: opus`. `sonnet`'s prior referents (`/github-review-comments`, `/github-review-failures`) are gone, so the guidance dangles a tier no local command uses. Drop the `haiku`/`sonnet` clauses and describe the `opus` tier used by today's local commands.</violation>
</file>
Heads up: you’ve reached your flex budget. Increase your flex budget or wait for usage to reset.
Fix all with cubic | Re-trigger cubic
| @@ -0,0 +1,39 @@ | |||
| # Review rules: the client runtime and the effect wire | |||
|
|
|||
| Rules about `app/javascript/phlex/reactive/*.js` and the Ruby that compiles its payloads. Three of the five entries are *Not a bug* — the client's connect-time gate posture and its legacy arms draw a lot of reviewer fire, and the reasons they stay are worth keeping. | |||
There was a problem hiding this comment.
P3: The intro says "Three of the five entries are Not a bug", but this file contains six ### entries, of which exactly two are Not a bug (the connect-time gate posture and the legacy show-attribute arm). Correct the counts to "Two of the six entries". As durable memory the gate and future reviews read, a wrong entry count is misleading.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lode/review/client-runtime.md, line 3:
<comment>The intro says "Three of the five entries are *Not a bug*", but this file contains six `###` entries, of which exactly two are `Not a bug` (the connect-time gate posture and the legacy show-attribute arm). Correct the counts to "Two of the six entries". As durable memory the gate and future reviews read, a wrong entry count is misleading.</comment>
<file context>
@@ -0,0 +1,39 @@
+# Review rules: the client runtime and the effect wire
+
+Rules about `app/javascript/phlex/reactive/*.js` and the Ruby that compiles its payloads. Three of the five entries are *Not a bug* — the client's connect-time gate posture and its legacy arms draw a lot of reviewer fire, and the reasons they stay are worth keeping.
+
+### A gate that hides a dead control must consider the component's own root, not only its descendants
</file context>
|
|
||
| `rake build:js` runs `scripts/build_client.js`, which minifies each entry ON ITS OWN with `sourcemap: "linked"` and the four cross-module specifiers kept EXTERNAL. Per-file, never a bundle: the modules are pinned separately so an app can override the `confirm`/`compute`/`confirm_predicate` seams, and bundling would inline them and break every override. The output is deterministic (bun derives the sourcemap debugId from content), which is what lets the `.min.js`/`.map` be checked in and `rake build:js_check` gate CI on `git diff --exit-code` — with the pathspec QUOTED so git expands it against the index, or deleting a module would slip past the guard. | ||
|
|
||
| A source edit is therefore a THREE-file change: the source, the rebuilt `.min.js` + `.map`, and the re-synced `spec/dummy/public/vendor/<name>.js`. Two guards enforce it: `rake build:js_check` and `spec/phlex/vendored_controller_sync_spec.rb`, whose failure message prints the exact re-sync command. The vendored copies are byte-identical to the MINIFIED builds on purpose — production ships minified, so the browser suite must exercise minified code or a minifier-induced bug (a mangled name breaking a lifecycle hook, a dropped export) ships untested. |
There was a problem hiding this comment.
P3: The sentence claims a source edit is a "THREE-file change," but the list it enumerates contains four files: the source, the rebuilt .min.js, the rebuilt .map, and the re-synced vendored copy. Since this lode memory is meant to be precise (and every other count in it was computed and verified), name it four files rather than three.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lode/client-runtime/summary.md, line 17:
<comment>The sentence claims a source edit is a "THREE-file change," but the list it enumerates contains four files: the source, the rebuilt `.min.js`, the rebuilt `.map`, and the re-synced vendored copy. Since this lode memory is meant to be precise (and every other count in it was computed and verified), name it four files rather than three.</comment>
<file context>
@@ -0,0 +1,54 @@
+
+`rake build:js` runs `scripts/build_client.js`, which minifies each entry ON ITS OWN with `sourcemap: "linked"` and the four cross-module specifiers kept EXTERNAL. Per-file, never a bundle: the modules are pinned separately so an app can override the `confirm`/`compute`/`confirm_predicate` seams, and bundling would inline them and break every override. The output is deterministic (bun derives the sourcemap debugId from content), which is what lets the `.min.js`/`.map` be checked in and `rake build:js_check` gate CI on `git diff --exit-code` — with the pathspec QUOTED so git expands it against the index, or deleting a module would slip past the guard.
+
+A source edit is therefore a THREE-file change: the source, the rebuilt `.min.js` + `.map`, and the re-synced `spec/dummy/public/vendor/<name>.js`. Two guards enforce it: `rake build:js_check` and `spec/phlex/vendored_controller_sync_spec.rb`, whose failure message prints the exact re-sync command. The vendored copies are byte-identical to the MINIFIED builds on purpose — production ships minified, so the browser suite must exercise minified code or a minifier-induced bug (a mangled name breaking a lifecycle hook, a dropped export) ships untested.
+
+## Imports are bare specifiers, never relative
</file context>
| A source edit is therefore a THREE-file change: the source, the rebuilt `.min.js` + `.map`, and the re-synced `spec/dummy/public/vendor/<name>.js`. Two guards enforce it: `rake build:js_check` and `spec/phlex/vendored_controller_sync_spec.rb`, whose failure message prints the exact re-sync command. The vendored copies are byte-identical to the MINIFIED builds on purpose — production ships minified, so the browser suite must exercise minified code or a minifier-induced bug (a mangled name breaking a lifecycle hook, a dropped export) ships untested. | |
| A source edit is therefore a FOUR-file change: the source, the rebuilt `.min.js` + `.map`, and the re-synced `spec/dummy/public/vendor/<name>.js`. |
| | lint | `bundle exec rubocop` (`-A` to autocorrect) | all new cops on | | ||
| | one CI cell locally | `CAPYBARA_SERVER=falcon TRANSPORT=cable bundle exec rspec spec/system` | mirrors one `system` matrix cell | | ||
| | docs build / check | `cd docs && bundle exec rake lint && bundle exec rspec` | **`rake lint`, never bare `rubocop`** — the gem's ancestor `.rubocop.yml` excludes `docs/**/*`, so a bare run inspects zero files | | ||
| | client rebuild | `rake build:js`, then `rake build:js_check` | needs bun | |
There was a problem hiding this comment.
P3: rake build:js_check already depends on rake build:js, so the documented rake build:js, then rake build:js_check sequence runs the bun minify build twice. Document rake build:js_check alone (or note that js_check is the rebuild+verify step).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lode/workflow.md, line 17:
<comment>`rake build:js_check` already depends on `rake build:js`, so the documented `rake build:js`, then `rake build:js_check` sequence runs the bun minify build twice. Document `rake build:js_check` alone (or note that js_check is the rebuild+verify step).</comment>
<file context>
@@ -0,0 +1,136 @@
+| lint | `bundle exec rubocop` (`-A` to autocorrect) | all new cops on |
+| one CI cell locally | `CAPYBARA_SERVER=falcon TRANSPORT=cable bundle exec rspec spec/system` | mirrors one `system` matrix cell |
+| docs build / check | `cd docs && bundle exec rake lint && bundle exec rspec` | **`rake lint`, never bare `rubocop`** — the gem's ancestor `.rubocop.yml` excludes `docs/**/*`, so a bare run inspects zero files |
+| client rebuild | `rake build:js`, then `rake build:js_check` | needs bun |
+| run the app | `cd docs && bin/dev` (the demo site) or `rake dummy:server` (the dummy, PORT=3010) | |
+| benchmarks | `rake bench` (micro), `rake bench:request` (derailed), `rake bench:client` (bun) | |
</file context>
| | client rebuild | `rake build:js`, then `rake build:js_check` | needs bun | | |
| | client rebuild | `rake build:js_check` | rebuilds and drift-checks the minified client; needs bun | |
| — `/architect`, `/perf`, `/security`, `/review-pr` — have no plugin equivalent. | ||
|
|
||
| Local commands pin a model tier via frontmatter aliases: `haiku` for | ||
| mechanical/config work, `sonnet` for prescriptive pattern-following passes, `opus` |
There was a problem hiding this comment.
P3: The model-tier paragraph still describes sonnet ("prescriptive pattern-following passes") and haiku ("mechanical/config work") even though this PR retires the only commands pinned to them. The remaining local commands (/architect, /perf, /security, /review-pr) are all model: opus. sonnet's prior referents (/github-review-comments, /github-review-failures) are gone, so the guidance dangles a tier no local command uses. Drop the haiku/sonnet clauses and describe the opus tier used by today's local commands.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At CLAUDE.md, line 104:
<comment>The model-tier paragraph still describes `sonnet` ("prescriptive pattern-following passes") and `haiku` ("mechanical/config work") even though this PR retires the only commands pinned to them. The remaining local commands (`/architect`, `/perf`, `/security`, `/review-pr`) are all `model: opus`. `sonnet`'s prior referents (`/github-review-comments`, `/github-review-failures`) are gone, so the guidance dangles a tier no local command uses. Drop the `haiku`/`sonnet` clauses and describe the `opus` tier used by today's local commands.</comment>
<file context>
@@ -73,27 +80,34 @@ re-sync command.
+— `/architect`, `/perf`, `/security`, `/review-pr` — have no plugin equivalent.
+
+Local commands pin a model tier via frontmatter aliases: `haiku` for
+mechanical/config work, `sonnet` for prescriptive pattern-following passes, `opus`
+for orchestration, security, review synthesis and the reasoning-heavy specialists
+(`/architect`, `/security`, `/review-pr`, `/perf`). Choose Fable per-session with
</file context>
Summary
This repository joins the shared
lodeplugin from zoolutions/claude-plugins: durable memory inlode/, a pre-PR gate that reviews every branch against the repo's own rules and learnings before anything can be pushed, and the shared workflows (/lode:lfg,/lode:review-pr,/lode:finish-prs,/lode:debug-flaky,/lode:tdd,/lode:plan) readinglode/workflow.md.lode/— summary, terminology, practices, map, and nine subsystem summaries (core and config, component, endpoint, streaming, async and defer, client runtime, tooling, testing and CI, docs site). Every claim cites a file and method; every count was computed (17 JS verbs, 12 registries, 11 removed broadcasts, 10 removed class verbs, 6 refused ops, 8 param types, 5 vendored client files, 5,787 JS source lines).lode/review/— 37 rules in seven files: all 8 cubic learnings for this repo plus 27 from the review threads of merged PRs feat(engine): turnkey APM adapters — Phlex::Reactive.apm = #210 through fix(release): bump lockfile pins with a text edit, not bundle lock --local #253, six merged where both sources described one finding, four reasoned rejections as Not a bug; 23 name the spec that proves them and 10 say no automated test does.lode/workflow.md(136 lines) — the profile.lfg,tdd,plan,github-review-pr,github-review-failures,github-review-comments. Kept:architect,perf,security,review-pr..claude/settings.jsonenableslode@zoolutions;CLAUDE.mdgains a Memory section and the new command rows;.claude/README.mdandSKILL_TEMPLATE.mdnow describe the local commands and the plugin's;.gitignoregainslode/tmp/.No Ruby changes. Two stale rules worth a follow-up:
CLAUDE.md:118and.claude/rules/{performance,testing}.mdstill namebroadcast_*_toas the API, though those 11 methods were removed in #185 and now raise; and.claude/rules/git-workflow.md:51saysrake releasere-locks the tracked lockfiles, while since #253 it does a text edit precisely because a re-resolve breaks. Seven smaller doc-versus-code gaps are recorded in the lode where they apply.Test plan
rake -T(18 tasks),rspec --version,rubocop --version,bin/release --help,bun --version,cd docs && rake -T; the suite needs Postgres and was not run/lode:lfgon the rules fix above reads the profile and reaches the gateDeviations & judgment calls
/lode:seed, resumed once after a rate limit (every draft re-verified; seven counts corrected), then gated here.LODE_SKIP_GATE=1after the gate passed: the orchestrating session runs the cached 0.1.0 push hook keyed on a different checkout. A session opened here will not need it.Gate
Rounds: 1. Findings: 2 P1 fixed (the authoring guide taught retired commands; the route-file merge rule had vanished), 0 P2, 1 P3. Rejected 0, deferred 0.
https://claude.ai/code/session_01Hga3idYBp7fWdj7GmmfofF
Summary by cubic
Seeds durable project memory in
lode/and enables the sharedlodeplugin's pre-PR gate, which reviews every branch against the repo's own rules and learnings before anything can be pushed.Memory and gate
.claude/settings.json;lode/tmp/is gitignored.Commands
lfg,tdd,plan,github-review-pr,github-review-failures,github-review-comments) superseded by the plugin's/lode:*commands.architect,perf,security, andreview-pr; updatesCLAUDE.md,.claude/README.md, andSKILL_TEMPLATE.mdto reference the plugin's commands.CLAUDE.mdand.claude/rules/{performance,testing}.mdstill name the removedbroadcast_*_toAPI, andgit-workflow.mdstill saysrake releasere-locks lockfiles.Written for commit 99f8487. Summary will update on new commits.