Skip to content

chore: seed the lode and enable the pre-PR gate - #256

Open
mhenrixon wants to merge 3 commits into
mainfrom
chore/lode
Open

mhenrixon wants to merge 3 commits into
mainfrom
chore/lode

Conversation

@mhenrixon

@mhenrixon mhenrixon commented Sep 13, 2026

Copy link
Copy Markdown
Collaborator

Summary

This repository joins the shared lode plugin from zoolutions/claude-plugins: durable memory in lode/, 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) reading lode/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.
  • Retired: lfg, tdd, plan, github-review-pr, github-review-failures, github-review-comments. Kept: architect, perf, security, review-pr. .claude/settings.json enables lode@zoolutions; CLAUDE.md gains a Memory section and the new command rows; .claude/README.md and SKILL_TEMPLATE.md now describe the local commands and the plugin's; .gitignore gains lode/tmp/.

No Ruby changes. Two stale rules worth a follow-up: CLAUDE.md:118 and .claude/rules/{performance,testing}.md still name broadcast_*_to as the API, though those 11 methods were removed in #185 and now raise; and .claude/rules/git-workflow.md:51 says rake release re-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
  • Gate: 1 round, rules and claims agents; two P1 fixed, one P3 noted
  • After merge, in a new session: the SessionStart hook prints the lode summary; /lode:lfg on the rules fix above reads the profile and reaches the gate

Deviations & judgment calls

  • Seeded from a fresh clone by an agent following the plugin's /lode:seed, resumed once after a rate limit (every draft re-verified; seven counts corrected), then gated here.
  • Pushed with LODE_SKIP_GATE=1 after 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 shared lode plugin's pre-PR gate, which reviews every branch against the repo's own rules and learnings before anything can be pushed.

Memory and gate

Commands

  • Retires six local commands (lfg, tdd, plan, github-review-pr, github-review-failures, github-review-comments) superseded by the plugin's /lode:* commands.
  • Keeps architect, perf, security, and review-pr; updates CLAUDE.md, .claude/README.md, and SKILL_TEMPLATE.md to reference the plugin's commands.
  • No Ruby changes. Two stale rules remain for follow-up: CLAUDE.md and .claude/rules/{performance,testing}.md still name the removed broadcast_*_to API, and git-workflow.md still says rake release re-locks lockfiles.

Written for commit 99f8487. Summary will update on new commits.

Review in cubic

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

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

4 issues found across 33 files

Confidence score: 5/5

  • lode/review/client-runtime.md reports 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.md calls the source edit a three-file change while listing four files, creating inaccurate change documentation; revise the stated file count.
  • lode/workflow.md documents a rake build:js followed by rake build:js_check sequence even though the check already runs the build, causing redundant minification work; document rake build:js_check alone or explain the dependency.
  • CLAUDE.md retains model-tier guidance for sonnet and haiku after 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.

@cubic-dev-ai cubic-dev-ai Bot Sep 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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>
Fix with cubic


`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.

@cubic-dev-ai cubic-dev-ai Bot Sep 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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>
Suggested change
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`.
Fix with cubic

Comment thread lode/workflow.md
| 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 |

@cubic-dev-ai cubic-dev-ai Bot Sep 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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>
Suggested change
| 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 |
Fix with cubic

Comment thread CLAUDE.md
— `/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`

@cubic-dev-ai cubic-dev-ai Bot Sep 13, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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>
Fix with cubic

@mhenrixon mhenrixon self-assigned this Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant