Skip to content

fix(web): tolerate external project script ids in keybinding commands - #7961

Closed
xuzhaorui wants to merge 1 commit into
pingdotgg:mainfrom
xuzhaorui:fix/7851-allow-external-project-script-ids
Closed

fix(web): tolerate external project script ids in keybinding commands#7961
xuzhaorui wants to merge 1 commit into
pingdotgg:mainfrom
xuzhaorui:fix/7851-allow-external-project-script-ids

Conversation

@xuzhaorui

@xuzhaorui xuzhaorui commented Aug 23, 2026

Copy link
Copy Markdown

Problem

The server accepts any non-empty trimmed string as a ProjectScript.id, but the client's SCRIPT_RUN_COMMAND_PATTERN only allowed lowercase slugs of up to 24 characters. An id dispatched over the API (e.g. a UUID) made commandForProjectScript throw during render, crashing every thread view and the project settings panel with no way to repair from the UI.

Fix

Relax the pattern's middle segment to TrimmedNonEmptyString, matching the server-side constraint. UI-generated ids are still slugs via nextProjectScriptId, so nothing changes for normal usage; existing keybinding rules keep decoding.

Fixes #7851

Validation

  • vp test run packages/contracts/src/keybindings.test.ts apps/web/src/projectScripts.test.ts — 19 tests passed (includes new UUID round-trip cases)
  • pnpm --filter @t3tools/contracts typecheck
  • pnpm --filter @t3tools/web typecheck
  • vp fmt --check, vp lint, git diff --check

Worked on by ox-alpha via the pi coding agent harness.

Note

Accept external script IDs in script.<id>.run keybinding commands

Replaces the constrained NonEmptyString schema for the middle segment of keybindings.SCRIPT_RUN_COMMAND_PATTERN with TrimmedNonEmptyString, so external IDs like UUIDs are accepted. Tests in keybindings.test.ts and projectScripts.test.ts are updated to cover UUID-style IDs and confirm that empty IDs remain invalid.

  • Risk: removes the previous /^[a-z0-9][a-z0-9-]*$/ pattern and max-length checks on the script ID segment; any trimmed non-empty string is now valid.

Macroscope summarized 6be823d.

The server accepts any non-empty trimmed string as a ProjectScript id,
but the client's SCRIPT_RUN_COMMAND_PATTERN only allowed lowercase slugs
of up to 24 characters. An id dispatched over the API (e.g. a UUID) made
commandForProjectScript throw during render, crashing every thread view
and the project settings panel with no way to repair from the UI.

Relax the pattern's middle segment to TrimmedNonEmptyString, matching
the server-side constraint. UI-generated ids are still slugs via
nextProjectScriptId, so nothing changes for normal usage; existing
keybinding rules keep decoding.

Fixes pingdotgg#7851

Worked on by ox-alpha via the pi coding agent harness.
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: da5d69c7-ab66-4b92-a740-eb4ab54b0883

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 23, 2026
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 27, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 28, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 28, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 28, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 28, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 28, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 29, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 29, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 29, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 30, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Aug 31, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 1, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 2, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 2, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 2, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 2, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 2, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 2, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 3, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 3, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 3, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 3, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 3, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 5, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 5, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 5, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 5, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 5, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
lastobelus added a commit to lastobelus/lastCode that referenced this pull request Sep 5, 2026
…#112)

## Summary

- import the maintainer-preferred fix from pingdotgg#7961 at
pinned head `6be823df41b105ddee33677f0b72aa4f5ad1c868`
- accept every canonical non-empty project-script ID when constructing
dynamic keybinding commands, matching the existing `ProjectScript`
contract
- keep UI-generated IDs as the existing lowercase slugs while allowing
externally supplied and already-saved IDs
- reject whitespace-padded dynamic commands instead of accepting
shortcuts that cannot match normalized saved IDs

## Incident

A saved htulo action used ID `build-intel-package-macos` (25
characters). The renderer mapped that valid project script through a
24-character template-literal schema during render, throwing `Expected a
string matching template literal parts` in both thread controls and
Project Settings.

No persisted project data was changed or migrated.

## Validation

- 24 focused tests across the dynamic-command contract, project-script
helpers, and project-script keybinding decoder
- contracts and web typechecks
- focused formatting and lint
- committed-range `git diff --check`
- disposable matched fixture with the exact 25-character action ID
rendered in chat
- locally installed recovery build opened the real htulo thread and
rendered **Build Intel package (macOS)** in Project Settings

## Provenance

- upstream issue: pingdotgg#7851
- upstream PR: pingdotgg#7961
- exact upstream commit preserved by `cherry-pick -x`

Refs #103

---------

Co-authored-by: xuzhaorui <119386408+xuzhaorui@users.noreply.github.com>
@juliusmarminge

Copy link
Copy Markdown
Member

Superseded by #10019 — same bug (invalid script IDs crashing threads via commandForProjectScript). Main now validates new IDs server-side and returns null for unsupported commands instead of relaxing the keybinding schema.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Server accepts project script ids that the client keybinding schema rejects, every thread view of the project crashes

2 participants