Know what Studio owns
Portal Studio owns the customer-facing shell: pages, component placement, brand tokens, responsive behavior, navigation, footer, identity presentation, ticket journeys and releases. The Help Center owns languages, categories, sections and article content. Studio consumes that content through a protected bridge; it never creates a second article store.
Complete readiness before building deeply
- Abrir Portal Studio → Start → Readiness.
- Confirm the canonical Portal address and open it in a separate tab.
- Set the logo, browser icon, touch icon, social image and theme color.
- Confirm Help Center languages; change language authority in Help Center, not Studio.
- Configure navigation and the global enterprise footer.
- Choose a ticket journey and configure at least one request form.
- Keep at least one safe sign-in method active and review identity discovery.
- Run Quality and establish the signed preview handshake.
- Create the first governed release after every blocking item is clear.
The readiness percentage is calculated from saved workspace data and preview state. Selecting an item routes directly to its owning panel.
Build pages and reusable sections
- Abrir Build → Pages and select a protected system page or create a custom page.
- Set the route, title, access mode and locale behavior. Protected system routes cannot be deleted.
- Abrir Components, filter by job or maturity, and place a component in a compatible slot.
- Use the inspector for content, appearance, binding, visibility and accessibility.
- Use reusable patterns for repeated structures; keep organization or brand differences in variants.
- Save the draft and exercise loading, empty, error, guest and signed-in states in preview.
Preview real journeys, not one happy screen
- Choose guest support, signed-in ticket, billing care, organization or knowledge handoff.
- Switch personas, organization, role and Help Center language.
- Inspect mobile, large mobile, tablet, laptop, desktop, wide and ultrawide breakpoints.
- Check inherited, overridden and reset values; avoid needless breakpoint duplication.
- Run keyboard, RTL, reduced-motion, loading, empty, unavailable and permission states.
- Use Test Lab for accessibility, payload, route, binding and renderer findings before review.
Operate a Zendesk-level Help Center without duplicate content
- Create categories, sections, articles, translations, attachments and templates in Help Center.
- Enable languages there; localized slugs, search, feeds, SEO and article chrome follow the same authority.
- In Studio, place knowledge search, category/resource grids, feeds, topic accordion, article, table of contents, feedback, related and previous/next components.
- Configure featured, popular and recent feeds; use contextual suggestions in ticket flows.
- Preview no-results, long articles, attachments, feedback, watch/subscription and ticket handoff.
- Verify clean locale routes, canonical/hreflang, structured data and cache invalidation after publication.
Configure sign-in safely
- Abrir Identity & organizations → Identity and keep at least one sign-in path enabled.
- Choose default method, registration policy, session duration, SSO-domain enforcement and discovery behavior.
- Add providers with visual routing fields: type, domains, priority, presentation, enabled and verified state. Secrets stay in the identity subsystem.
- For SCIM, enable provisioning, copy the exact workspace endpoint and rotate the token. Store the one-time token in the IdP.
- Map claims and organization membership, then test create, update, group membership and deactivation with a test tenant.
- Preview guest, customer, delegated organization and blocked states before publication.
Compose the complete support journey
- Select direct form, wizard, search-first, hub or service-desk entry.
- Create a named, versioned request form with sections and accessible field labels.
- Build visual conditions, routing, SLA and approval steps; advanced JSON is for reviewed developer changes only.
- Configure list, detail, thread, timeline, attachment, approval, SLA and reply surfaces.
- Test guest lookup, signed-in requests, organization visibility, upload failure, email notification and knowledge deflection.
- Save a draft; publish only after the route adapter and notification path pass preflight.
Move through a governed release
- Run validation and Test Lab. Fix blocking findings; acknowledge permitted warnings with context.
- Add release notes and request review. Reviewers comment on stable page/node paths.
- Approvers inspect the diff, preview journeys, permission changes and evidence.
- Publish or schedule through the background worker. Leaving Studio does not cancel a durable job.
- Watch progress, health and correlation ID. Stop/retry only from job controls.
- Verify critical routes, identity, tickets and knowledge. Roll back to an immutable prior release when required.
| Capacidad | Propósito |
|---|---|
| View / Edit | Inspect or change drafts without release authority. |
| Review / Approve | Separate feedback and approval from authorship. |
| Schedule / Publish / Rollback | Independent production controls. |
| Identity / SCIM / Migrate / Components / Diagnostics | Restrict sensitive specialist operations. |
Migrate with evidence and a way back
- Select the provider blueprint and create a dry run.
- Review discovered settings, unmapped values, content counts and visual parity captures.
- Complete safe mappings and rerun the structured diff.
- Apply to a draft, reconcile counts and preview every protected journey.
- Record authorized acceptance; never overwrite the current published release during import.
- Publish through governance and keep the migration report, release ID and rollback point together.
Extend contracts, not templates
A safe extension registers a stable component type and schema, declares permissions and data needs, renders through the canonical compiler, and supplies deterministic fixtures/tests. Do not query arbitrary tables, inject editor JavaScript into the public Portal, create another article repository, or bypass the release gate.
Portal Document v2
Pages contain stable nodes, slots, properties, bindings, responsive overrides, conditions and accessibility metadata.
Component Registry
One contract feeds Studio, compiler, documentation, migration and maturity checks.
Data Source Registry
Allowlisted, read-only, permission-scoped DTOs replace arbitrary SQL or dynamic actions.
One renderer
Preview and public output share compilation, sanitization, budgets and runtime states.
Define a component package
Use a lowercase namespaced ID and semantic version. Supply both compatibility property names shown because package inspection and security validation perform independent checks.
{
"schema_version": 1,
"id": "acme.support_health",
"slug": "acme-support-health",
"name": "Support health",
"version": "1.0.0",
"entry": "renderer.php",
"renderer": "server",
"server_renderer": "renderer.php",
"public_renderer": "public.js",
"schema": {
"type": "object",
"properties": {
"heading": {"type": "string", "maxLength": 120},
"showSla": {"type": "boolean", "default": true}
},
"additionalProperties": false
},
"permissions": ["tickets.read"],
"data_scopes": ["tickets.mine"],
"accessibility": {
"landmark": "section",
"nameFrom": "heading",
"emptyState": true,
"errorState": true
},
"performance": {"max_js_bytes": 12000, "max_css_bytes": 8000},
"performance_budget": {"js": 12000, "css": 8000, "requests": 0}
}
Node shape
{
"id": "node-support-health",
"type": "custom.acme_support_health",
"props": {"heading": "Support health", "showSla": true},
"bindings": {"requests": {"source": "tickets.mine", "limit": 5}},
"responsive": {"mobile": {"padding": "16px"}, "desktop": {"padding": "24px"}},
"conditions": [{"field": "identity.signed_in", "operator": "equals", "value": true}],
"a11y": {"label": "Support health"}
}
- IDs remain stable across edits and migrations.
- Properties reject undeclared fields and unsafe HTML.
- Every data-bound view defines loading, empty, permission and retryable-error output.
- Container components name their slots; leaves cannot accept arbitrary children.
- Mark maturity honestly: planned blocks, beta warns, GA requires full evidence.
Use permission-safe DTOs
- Choose an existing dotted ID such as
tickets.mine,knowledge.featuredocustomer.profile. - Bind only fields declared by its versioned DTO. Unknown sources fail with
data_source.unknown. - Pass the already-authorized Portal context; never accept workspace/customer identity from an untrusted property.
- List limits are clamped to 1–100. Normalize pagination, locale and search values.
- If a new source is unavoidable, add its stable definition, safe mapping, permissions, empty behavior and preview fixture together.
{
"success": true,
"source": "tickets.mine",
"contract_version": 1,
"items": [
{"id": 42, "number": "REQ-42", "subject": "Example", "status": "open"}
]
}
Stay inside the trust boundaries
| Boundary | Required behavior |
|---|---|
| Espacio de trabajo | Resolve from the trusted host/route/session, then scope every read and write before execution. |
| HTML | Use the Portal sanitizer/parser allowlist. Never concatenate untrusted attributes, URLs, CSS or script. |
| Vista previa | Require same-origin source window, signed channel version and nonce. Ignore unsolicited messages. |
| Identidad | Keep secrets outside documents. SCIM is bearer-authenticated, sessionless and workspace-bound. |
| Packages | Reject traversal, absolute paths, links/special files, oversize archives, checksum/signature mismatch and unknown permissions. |
| Errors | Return stable code, safe message, retryability, remediation and correlation ID; log private exceptions server-side. |
| Knowledge | Read via HelpCenterBridge. Never author or duplicate Help Center articles in an extension. |
{
"success": false,
"error": {
"code": "studio.permission_denied",
"message": "You do not have permission to publish the Portal.",
"retryable": false,
"correlation_id": "ps_…",
"meta": {"capability": "publish"}
}
}
Inspect, install and upgrade atomically
- Put
component.jsonat the ZIP root and keep every path relative. - Run inspection first. The installer caps archives at 500 entries and 25 MB extracted; security validation adds independent limits.
- Verify the expected SHA-256 and package signature in the release process.
- Install to a versioned directory. Never mutate an installed version in place.
- Provide property migrations for breaking schema changes and preserve unknown compatibility fields.
- Open the component in a draft, run every state/viewport/persona fixture and publish through governance.
- Rollback activates the prior immutable component/document release; retain its reproducibility evidence.
Prove the extension on the same release hash
php tools/portal_studio_certify.php --source-only --json
php tools/test_portal_studio_v2.php
php tools/test_portal_studio_ultimate.php
php tools/test_portal_studio_engineer.php
php tools/test_portal_component_contracts.php
php tools/test_portal_one_renderer.php
php tools/test_portal_shell_contract.php
php tools/test_portal_knowledge_contract.php
node tools/test_portal_studio_ultimate_browser.js
Source gates are necessary, not sufficient. Attach database/migration, real-browser visual, identity-provider, authorization-isolation, accessibility, performance, queue/cron, mail/attachment, backup/restore and deployment evidence to the same immutable release hash. Unknown required evidence must fail the release.
- Unit: schema, sanitization, DTO shape, conditions, migrations and typed failures.
- Contract: loading/empty/error/success, maturity, slots, bindings and one-renderer parity.
- Browser: keyboard, focus, semantics, RTL, zoom/reflow, reduced motion and every breakpoint.
- Security: cross-workspace probes, forged actions, package attacks, preview spoofing and secret leakage.
- Operations: durable progress, leave/return, stop/retry/resume, scheduler heartbeat and rollback.
Troubleshoot by state and correlation ID
| State | What to do |
|---|---|
| Permission | Request the named capability. Hidden UI is convenience; the backend always enforces it. |
| Validation | Open the reported page/node/field, correct it, then rerun preflight. |
| Conflict | Reload the latest revision, compare changes and reapply intentionally. Never force overwrite. |
| Offline / retryable | Keep the draft, restore connectivity, retry through the action and verify durable job state. |
| Fatal / unavailable | Copy the correlation ID and timestamp for support. Never paste secrets or private exception text. |
| Publish failed | Inspect preflight/job output, retry only retryable stages, or roll back to the last healthy release. |
| SCIM 401/403 | Confirm endpoint/workspace, bearer token, enabled state and rotation; never use a browser session cookie. |
| Knowledge is stale | Verify locale/publication in Help Center, then inspect cache invalidation and the clean localized route. |
This guide is print-ready. Use Print → Save as PDF for a controlled offline copy.