Skip to content

Show actionable Apps manifest validation errors - #19

Merged
nathan-thillairajah merged 1 commit into
mainfrom
codex/apps-validation-diagnostics
Oct 14, 2026
Merged

nathan-thillairajah merged 1 commit into
mainfrom
codex/apps-validation-diagnostics

Conversation

@nathan-thillairajah

@nathan-thillairajah nathan-thillairajah commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

An Apps deploy with a missing ASSETS binding returns a generic HTTP 400, leaving the caller without enough information to fix the artifact. The backend identifies the missing binding, but the CLI suppresses its message because that same field can contain internal errors.

This recognizes the fixed missing-manifest and required-binding diagnostics and gives the caller enough guidance to repair the manifest and rebuild. Unknown manifest failures point to the selected control plane's contract without exposing arbitrary backend messages. The error code, HTTP status, and trace ID remain available for diagnosis.

Quota recovery remains in #8; both changes touch the shared error handler and need to retain each other's diagnostics. Blox customers receive this fix when the CLI image is rebuilt and updated.

@jedwards27 jedwards27 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.

🤖 Approved on Jude's behalf by their AI agent. Reviewed commit 1adf845; no blocking findings. The fixed-message allowlist matches the backend validator, repair guidance matches the advertised contract, and error classification/correlation and no-retry behavior are preserved.

Verification: all 341 workspace tests passed (including 68 Apps tests); formatting and diff checks passed.

Non-blocking merge coordination: #8 also changes control_plane_http_failure. When combining the changes, preserve its structured quota recovery fields alongside this PR's http_status and validation diagnostics, and retain both sets of regression tests.

@nathan-thillairajah
nathan-thillairajah merged commit 8ee5e92 into main Oct 14, 2026
4 checks passed
nathan-thillairajah added a commit that referenced this pull request Oct 29, 2026
… errors

`bl apps get` now reads the access policy too and prints one readable
line about who can open the app, beside its link and the Share & manage
link. `handoff` becomes a hidden alias for the same output, and
`get --json` keeps its inspection fields with the handoff fields added.

`visibility` and `community grant|revoke` print who can open the app
afterwards unless `--json` is passed. Community names come from Kgoose
when a local login is available, otherwise IDs are shown.

Known Compose error codes get a CLI-written sentence and, when the
server sends none, a next step. The server's error.message is still
never printed, as in #19.

Help text now says workspace and private, hides `access set` and its
individual viewers, and fills in every sharing argument.

Co-authored-by: Irving B <6c4c50b3b6dee89feaca78ea87eb5c8fde651d2d7b39d6da8c9354ce7a34e313@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
nathan-thillairajah added a commit that referenced this pull request Oct 29, 2026
* BOT-2440: let handoff show the audience without a portal URL, and give dead-end errors a next step

`bl apps handoff` now reads the app and its access policy even when no portal
origin is configured, omits the Share & manage link (management_url is null),
and says how to pass --management-base-url. An invalid origin still errors, and
the portal is still never inferred from a workstation or app hostname.

The proxy refusal for `bl apps community` and the "app has no active sharing
lifecycle" failure now carry a next_action pointing the owner to Share &
manage, with the portal link when BL_APPS_MANAGEMENT_BASE_URL is set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: only deep-link Share & manage when the workspace is known

The portal opens an app's dialog only when the URL has both app and workspace,
so an app-only link lands on the plain list. Without a workspace, point at
/hosted-apps and name the app to choose. The missing-lifecycle error uses the
workspace_id from the sharing response when it carries one; the proxy refusal
makes no request, so it never has one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: drop the speculative workspace lookup from community errors

The community grant read does not return a workspace_id, so the missing-lifecycle
error could never build a deep link. Both community errors now use the
workspace-less form and name the app to choose.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: give handoff and community errors a next step that works

Review fixes for #40:
- Treat a blank BL_APPS_MANAGEMENT_BASE_URL as unset, prefer the flag, and
  name the env var when its value is invalid.
- Build the handoff next_action from whether the audience is verified and
  whether a Share & manage link exists, so it never offers a link it lacks.
- Without a portal origin, point owners to Hosted Apps in the BuilderLab
  portal.
- Compose answers the community grant read with 409 community_grant_conflict
  when the app has no lifecycle. Add a deploy-first next_action to that 409
  and use the same wording for the 200-with-no-lifecycle guard.
- Update the README handoff section.

Co-authored-by: Helly R <755566517b9f4a67070220593bc7ef951f4b6f39175135818360f233c6a5e152@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP: bl apps community list via Kgoose joined communities

Prototype only; no tests yet. Verified against bb-public staging.

Co-authored-by: Helly R <755566517b9f4a67070220593bc7ef951f4b6f39175135818360f233c6a5e152@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: make bl apps get say who can open an app, and explain known errors

`bl apps get` now reads the access policy too and prints one readable
line about who can open the app, beside its link and the Share & manage
link. `handoff` becomes a hidden alias for the same output, and
`get --json` keeps its inspection fields with the handoff fields added.

`visibility` and `community grant|revoke` print who can open the app
afterwards unless `--json` is passed. Community names come from Kgoose
when a local login is available, otherwise IDs are shown.

Known Compose error codes get a CLI-written sentence and, when the
server sends none, a next step. The server's error.message is still
never printed, as in #19.

Help text now says workspace and private, hides `access set` and its
individual viewers, and fills in every sharing argument.

Co-authored-by: Irving B <6c4c50b3b6dee89feaca78ea87eb5c8fde651d2d7b39d6da8c9354ce7a34e313@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: keep the community name lookup in get short

Co-authored-by: Irving B <6c4c50b3b6dee89feaca78ea87eb5c8fde651d2d7b39d6da8c9354ce7a34e313@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: address review on bl apps sharing output

- community list errors use CLI-written text per status and code, never
  the Kgoose message or body, and a 200 that isn't a JSON object with a
  communities list is an error instead of an empty account
- community_grant_conflict and community_grant_denied explain themselves
- a bad BL_APPS_MANAGEMENT_BASE_URL drops only the link; a bad
  --management-base-url still fails before any request
- the who-can-open count needs an owner to leave out, and the access-read
  and tier-resolution texts say what actually happened
- tests for community list end to end, the session header, redaction and
  the no-community lookup short-circuit

Co-authored-by: Irving B <6c4c50b3b6dee89feaca78ea87eb5c8fde651d2d7b39d6da8c9354ce7a34e313@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* BOT-2440: don't ask for a portal origin when only the app's workspace is missing

When the portal is configured but the app comes back without workspace_id,
the handoff now says the workspace is missing and points the owner to Share
& manage by app name, instead of asking for --management-base-url or
BL_APPS_MANAGEMENT_BASE_URL again.

Co-authored-by: Irving B <6c4c50b3b6dee89feaca78ea87eb5c8fde651d2d7b39d6da8c9354ce7a34e313@remote-agent-pilot.communities.buzz.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Helly R <755566517b9f4a67070220593bc7ef951f4b6f39175135818360f233c6a5e152@remote-agent-pilot.communities.buzz.xyz>
Co-authored-by: Irving B <6c4c50b3b6dee89feaca78ea87eb5c8fde651d2d7b39d6da8c9354ce7a34e313@remote-agent-pilot.communities.buzz.xyz>
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.

2 participants