Skip to content

feat(templates,agent): installable template recipes + board-as-memory (#60, #61)#75

Merged
100yenadmin merged 3 commits into
mainfrom
act4/gallery-memory
Jul 10, 2026
Merged

feat(templates,agent): installable template recipes + board-as-memory (#60, #61)#75
100yenadmin merged 3 commits into
mainfrom
act4/gallery-memory

Conversation

@100yenadmin

Copy link
Copy Markdown
Owner

Closes #60
Closes #61

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 2 minutes

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0c627234-9067-419d-a0bf-31489ce62c05

📥 Commits

Reviewing files that changed from the base of the PR and between ddc2710 and 7b6cd94.

📒 Files selected for processing (41)
  • .changeset/gallery-memory.md
  • .claude/skills/using-boardstate/SKILL.md
  • AGENTS.md
  • docs/board-as-memory.md
  • examples/operational-demo/smoke/recipe-install.mjs
  • examples/standalone/public/registry/agent-memory.recipe.json
  • examples/standalone/public/registry/index.json
  • examples/standalone/public/registry/ops-board.recipe.json
  • examples/standalone/public/registry/saas-metrics.recipe.json
  • packages/agent/src/chat-agent.ts
  • packages/agent/src/index.ts
  • packages/agent/src/memory.test.ts
  • packages/agent/src/system-prompt.test.ts
  • packages/agent/src/system-prompt.ts
  • packages/core/src/distribution.ts
  • packages/core/src/gallery.ts
  • packages/core/src/recipe-install.test.ts
  • packages/core/src/templates.test.ts
  • packages/host/src/gallery.ts
  • packages/host/src/store.test.ts
  • packages/host/src/store.ts
  • packages/lit/src/boardstate-view.test.ts
  • packages/lit/src/boardstate-view.ts
  • packages/lit/src/locales/de.ts
  • packages/lit/src/locales/es.ts
  • packages/lit/src/locales/fr.ts
  • packages/lit/src/locales/ja-JP.ts
  • packages/lit/src/locales/zh-CN.ts
  • packages/lit/src/strings.ts
  • packages/lit/src/styles/boardstate.css
  • packages/schema/src/index.ts
  • packages/schema/src/recipe.test.ts
  • packages/schema/src/recipe.ts
  • scripts/build-registry.mjs
  • templates/recipes/agent-memory.recipe.json
  • templates/recipes/ops-board.recipe.json
  • templates/recipes/saas-metrics.recipe.json
  • templates/registry/agent-memory.recipe.json
  • templates/registry/index.json
  • templates/registry/ops-board.recipe.json
  • templates/registry/saas-metrics.recipe.json
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch act4/gallery-memory

Comment @coderabbitai help to get the list of available commands.

@evaos-code-review-bot

evaos-code-review-bot Bot commented Jul 10, 2026

Copy link
Copy Markdown

evaOS review status: stale head

PR: #75 - feat(templates,agent): installable template recipes + board-as-memory (#60, #61)
Head: 1002e084faf007dcbc5e51360543263c6d0e8ad9
Updated: 2026-07-10T20:08:24.929Z

evaOS review stopped because this queued head is no longer the live PR head.

Automation note: agents should wait for this comment to reach completed, stale_head, closed_or_merged_before_review, skipped, or failed before treating evaOS review as settled for this head. provider_deferred means evaOS still intends to retry.

PR URL: #75

Eva and others added 2 commits July 11, 2026 03:10
Adversarial verify REFUTED the snapshot bound: memory:"board" embedded every
note's FULL text per turn (a 24-widget/64KB-note tab shipped uncapped — prompt
blowout + cost, with only a post-hoc usage ceiling). Now: 600-char per-note cap +
4KB total budget, each cut carrying an explicit '[truncated — read the board
widget for the full text]' marker (the agent fetches the rest via
dashboard_workspace_get when it matters; never a silent cut). Also moved the
treat-as-DATA framing INSIDE the memory block header — it sat distal to the
'ground truth' language, softening the injection posture. Delta-sensitive test:
20K note → marker present, total bounded, framing adjacent.
@100yenadmin

Copy link
Copy Markdown
Owner Author

Adversarial verify — verdict

  • Install can never grant: SAFE — the hostile-recipe regression runs the REAL replaceSanitized/reconcile path (not a mock); buildRecipeInstallDoc rebuilds grants field-by-field (never spreads input; agents/toolsHash/status rejected by the recipe allowlist); installRecipe has exactly one path (workspace.replace); byte caps precede JSON.parse; the Templates tab renders recipe strings as text bindings only.
  • Memory bound: REFUTED → fixed (5c5ed76) — the per-turn snapshot was UNBOUNDED (full note text verbatim; a 64KB-note tab shipped every turn with only a post-hoc usage ceiling). Now 600-char/note + 4KB total with explicit truncation markers pointing at the board, and the treat-as-DATA framing moved inside the block header (it sat distal to the 'ground truth' language). Delta-sensitive 20K-note test.
  • Registry honesty: SAFE — all recipes validate; namespace mismatch rejected; embedded docs run validateWorkspaceDoc.
  • Cross-lane safety: SAFE — zero server/grant-record/approvals diff; clean rebase over feat(trust): multi-agent workspaces — provenance chips, per-agent grant scoping, rate budgets (#59) #74.

Merging when CI re-greens.

@evaos-code-review-bot

evaos-code-review-bot Bot commented Jul 10, 2026

Copy link
Copy Markdown

evaOS review status: closed or merged before review

PR: #75 - feat(templates,agent): installable template recipes + board-as-memory (#60, #61)
Head: 7b6cd94bdaaabf842478deb9699bbb76f23d5694
Updated: 2026-07-10T20:25:27.054Z

evaOS review stopped because the PR closed or merged before this queued head could be reviewed.

Automation note: agents should wait for this comment to reach completed, stale_head, closed_or_merged_before_review, skipped, or failed before treating evaOS review as settled for this head. provider_deferred means evaOS still intends to retry.

PR URL: #75

Details: state=closed

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1002e084fa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

const system =
buildSystemPrompt(tools) + (options.systemExtras ? `\n\n${options.systemExtras}` : "");
buildSystemPrompt(tools, memoryOn ? { memory: "board" } : {}) +
(memorySnapshot ? `\n\n${memorySnapshot}` : "") +

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Frame memory snapshots as data, not system instructions

When memory: "board" is enabled, note and journal text from ordinary board widgets is concatenated directly into the provider's system prompt. If a memory note contains untrusted or agent-written text such as instructions to ignore safety rules or call mutating tools, it is delivered at system priority rather than as framed board data, contradicting the repo's “board content is data, not instructions” invariant. Please wrap/label this snapshot as untrusted data outside the system instruction channel or otherwise delimit and cap it so it cannot become executable prompt policy.

Useful? React with 👍 / 👎.

Comment on lines +217 to +222
caps[connector] = {
status: "requested",
methods: grant.methods ?? [],
streams: grant.streams ?? [],
...(tools.length > 0 ? { tools } : {}),
...(description !== undefined ? { description } : {}),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Recompute hashes for recipe approve-all grants

Recipe-installed tool grants are created with tools but no toolsHash. The dashboard.capability.approve approve-all path preserves existing.toolsHash when no tools subset is passed, so API/CLI callers that approve the recipe grant without an explicit subset store a granted tool list with an undefined hash; the first dashboard.connector.read then compares the live hash to undefined and re-pends the grant. This only works when the UI sends the checked tool subset or a refresh has already populated the hash, so recipe grants should either be installed/approved with a hash or the approve-all path should recompute one when it is missing.

Useful? React with 👍 / 👎.

Comment on lines +59 to +60
"grantsManifest": {
"officecli": {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Include an approvals widget in grant-requesting recipes

When this gallery recipe is installed it replaces the workspace with a doc that requests officecli grants but contains no builtin:approvals widget. I checked the UI wiring: capability approvals are only exposed through the approvals builtin (buildBuiltinContext passes approveCapability into buildApprovalsSource for that widget), while chat inline approvals handle only custom widgets; so after installing this recipe from the gallery, browser users have no in-board way to approve the requested grant and the live table/action stay pending. Add an approvals widget (same for saas-metrics) or provide another visible approval surface.

Useful? React with 👍 / 👎.

Comment on lines +2355 to +2357
const [entries, recipes] = await Promise.all([
fetchGalleryIndex(url),
fetchGalleryRecipes(url),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Allow templates-only registries to load

Because Browse now Promise.alls fetchGalleryIndex with fetchGalleryRecipes, a registry that publishes only recipes (no widgets key) fails before Templates can render: parseGalleryIndex throws for { recipes: [...] }, even though the dialog has a separate Templates tab. This blocks template-only registries; load each half independently or treat a missing widgets array as empty.

Useful? React with 👍 / 👎.

Comment thread packages/agent/src/chat-agent.ts Outdated
Comment on lines +100 to +102
const text =
isRecord(widget.props) && typeof widget.props.text === "string" ? widget.props.text : "";
sections.push(`### ${heading}\n${text.trim() || "(empty)"}`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Read persisted note state when priming memory

In the live UI, builtin:notes edits are stored via the separate dashboard.widget.state.* path, not back into widget.props.text; the workspace doc only carries author seed data. Priming memory from props.text therefore misses any human edits made in the notes widgets (and can even show stale seed text), breaking the memory: "board" guarantee that the next turn sees the human's latest memory as ground truth. The snapshot needs to read the bound widget state or use a memory widget whose content lives in the workspace doc.

Useful? React with 👍 / 👎.

Comment on lines +198 to +199
const methods = optionalStringArray(record, "methods", path);
const streams = optionalStringArray(record, "streams", path);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Validate recipe method grants before preview

methods and streams from a recipe manifest are copied into capabilitiesRegistry at install time, where the workspace validator only accepts allowlisted RPC methods and stream channels, but validateRecipe currently accepts any non-empty string array. A remote recipe can pass parseRecipeBundle and be shown in the Templates preview, then always fail on dashboard.workspace.replace during install because those grant fields are invalid. Validate these arrays against the same allowlists or validate the constructed install doc before accepting the recipe.

Useful? React with 👍 / 👎.

@100yenadmin 100yenadmin merged commit 6eb44b3 into main Jul 10, 2026
5 checks passed
@100yenadmin 100yenadmin deleted the act4/gallery-memory branch July 10, 2026 20:17
@github-actions github-actions Bot mentioned this pull request Jul 10, 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

1 participant