Skip to content

docs: ledger de contrato al día con B2B 1.5.0 / admin 1.1.0 - #1

Open
LucasLeguizamo wants to merge 1 commit into
mainfrom
docs/contract-gaps-1.5
Open

docs: ledger de contrato al día con B2B 1.5.0 / admin 1.1.0#1
LucasLeguizamo wants to merge 1 commit into
mainfrom
docs/contract-gaps-1.5

Conversation

@LucasLeguizamo

Copy link
Copy Markdown
Contributor

Revisión del contrato en vivo contra lo que tenían commiteado los clientes. Cuatro filas pasan a shipped y se anotan tres huecos nuevos, los tres verificados contra el spec (no supuestos).

Shipped

Qué Endpoints Efecto
Updates sin requestBody POST/PATCH /events/{id}/dates, PATCH /ticket-types/{id}, /membership-plans/{id}, /venues/{id} Desbloquea la Ola B del mcp — los 5 tools que faltaban (freeticket-mcp#4)
API key self-service GET/POST/DELETE /api-keys ft api-keys (ya en 0.8.0) — cierra cli#29
Service token de plataforma GET/POST/DELETE /api/admin/tokens ft admin tokens — saca a ft admin de pasear la cookie de sesión
Liquidaciones GET /settlements, GET /reports/financials ft settlements list, ft reports financials — avanza cli#32

Huecos nuevos

  • PDF de comprobante de liquidación. El contrato expone hasDocument y los fileName, pero no una URL de descarga — la propia descripción del endpoint dice que los archivos se bajan del panel. Bloquea archivar el comprobante junto al resto de la documentación financiera.
  • GET /staff sin batch cross-workspace. Sigue aceptando solo limit/cursor y scopeando por X-Workspace-Id: N workspaces = N round trips. El modo global del mcp (workspace: "all") tapa el síntoma orquestando el fan-out, pero el costo de red no cambia — que es justo lo que duele en cold start serverless.
  • Onboarding enterprise white-label. AdminWorkspaceUpdate sigue en name/slug/type/isPublished; no hay webTemplate, customDomain ni asignación manual de plan. ft admin enterprise no se puede construir sin inventar contrato, así que no se construye.

Los punteros de submódulo se actualizan cuando mergeen los PRs de cli/mcp/skills.

🤖 Generated with Claude Code

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Update CONTRACT-GAPS ledger for B2B 1.5.0 and Admin 1.1.0

📝 Documentation 🕐 10-20 Minutes

Grey Divider

AI Description

• Mark four previously tracked contract items as shipped in B2B 1.5.0 / Admin 1.1.0.
• Add three newly verified contract gaps blocking CLI/MCP capabilities.
• Clarify endpoint expectations and impacted tools for each shipped item/gap.
Diagram

graph TD
  A["CONTRACT-GAPS.md"] --> B["B2B API contract 1.5.0"] --> C["Shipped capabilities"] --> D["CLI (ft)"]
  A --> E["Admin API contract 1.1.0"] --> C --> F["MCP"]
  A --> G["New gaps identified"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Automate ledger from OpenAPI diffs
  • ➕ Reduces manual drift by generating shipped/gap candidates from spec changes
  • ➕ Makes version-to-version contract deltas auditable and reproducible
  • ➖ Doesn't catch behavior mismatches when the live API diverges from the spec
  • ➖ Requires tooling and conventions for mapping endpoints to product capabilities
2. Track gaps exclusively as GitHub issues
  • ➕ Keeps discussions, ownership, and prioritization in one workflow (issues/projects)
  • ➕ Easier to assign/triage than a markdown ledger
  • ➖ Harder to keep a single, readable “contract vs clients” snapshot
  • ➖ Loses the compact matrix view (endpoints × tools × status) that helps reviewers

Recommendation: Keep the markdown ledger (it provides a compact, shared snapshot across API/CLI/MCP), but consider adding lightweight automation that periodically proposes updates from OpenAPI diffs and links them to issues for ownership/triage.

Files changed (1) +7 / -1

Documentation (1) +7 / -1
CONTRACT-GAPS.mdMark shipped contract items and add three newly verified gaps +7/-1

Mark shipped contract items and add three newly verified gaps

• Moves the previously identified missing requestBody declarations to shipped (contract 1.5.0) and adds shipped rows for API key self-service, platform service tokens, and settlements/reporting endpoints. Adds three new identified gaps: settlement document download URL, cross-workspace staff batching, and enterprise white-label onboarding fields/endpoints.

CONTRACT-GAPS.md

@qodo-code-review

qodo-code-review Bot commented Aug 3, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (1) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. CONTRACT-GAPS.md not in English 📘 Rule violation ⚙ Maintainability
Description
The PR adds/updates technical documentation content in Spanish, but repository documentation must be
written in English. This breaks the repo’s documentation language/locale convention and reduces
consistency for the intended audience.
Code

CONTRACT-GAPS.md[R33-34]

+| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped |
+| API key de servicio self-service — un cron server-side (Vercel) no puede usar el device flow interactivo, y no había forma de acuñar una `ft_live_…` sin entrar al backend | `GET/POST/DELETE /api-keys` (scope `read`/`write`, `expiresAt`, el plano solo en la respuesta de creación) | B2B | cli ✓ (`ft api-keys`), mcp ✓ (solo list) | [freeticket-cli#29](https://github.com/AppFreeticket/freeticket-cli/issues/29) | shipped |
Evidence
PR Compliance ID 2 requires repository documentation to be written in English. The updated rows in
CONTRACT-GAPS.md (e.g., lines 33-39) are Spanish technical documentation text, violating the
stated convention.

CLAUDE.md: Documentation Language and Locale Conventions Must Be Followed
CONTRACT-GAPS.md[33-39]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Technical documentation updates in `CONTRACT-GAPS.md` are written in Spanish, but repo documentation must be in English.

## Issue Context
Per the documentation language/locale convention, technical documentation should be English (end-user copy may be neutral Spanish).

## Fix Focus Areas
- CONTRACT-GAPS.md[33-39]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Roadmap quedó desactualizado 🐞 Bug ⚙ Maintainability
Description
CONTRACT-GAPS.md marca como shipped el gap de updates sin requestBody, pero ROADMAP-AI-FIRST.md
todavía deja event_dates_create/update, ticket_types_update, plans_update y venues_update
como pendientes por ese mismo gap. Esto introduce drift de documentación y puede llevar a trabajo
duplicado o a creer que la Ola B sigue bloqueada.
Code

CONTRACT-GAPS.md[33]

+| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped |
Evidence
El ledger afirma que el gap de requestBody ya está resuelto y shipped, pero el roadmap todavía
lista esos mismos operationIds como pendientes por el mismo motivo.

CONTRACT-GAPS.md[32-34]
ROADMAP-AI-FIRST.md[69-104]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
El roadmap sigue afirmando que varios tools están bloqueados por el gap “sin requestBody”, pero el ledger ya lo marcó `shipped`.

### Issue Context
El PR cambia el estado del gap a `shipped` en `CONTRACT-GAPS.md`, pero no actualiza el roadmap donde esos items figuran como pendientes.

### Fix Focus Areas
- ROADMAP-AI-FIRST.md[75-103]
- CONTRACT-GAPS.md[33-33]

### Suggested change
- Marcar como completados (`[x]`) los items `event_dates_create`, `event_dates_update`, `ticket_types_update`, `plans_update`, `venues_update`.
- Remover la nota “hueco de contrato (sin requestBody)” o reemplazarla por una nota histórica (opcional) que apunte al contrato 1.5.0.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Columna de issues ambigua 🐞 Bug ⚙ Maintainability
Description
La tabla define la 5ª columna como “Issue free-admin”, pero se agregaron filas que enlazan issues de
freeticket-cli en esa columna. Esto rompe la semántica declarada del ledger y el workflow descrito
por endpoint-requester (gap ↔ issue en free-admin).
Code

CONTRACT-GAPS.md[34]

+| API key de servicio self-service — un cron server-side (Vercel) no puede usar el device flow interactivo, y no había forma de acuñar una `ft_live_…` sin entrar al backend | `GET/POST/DELETE /api-keys` (scope `read`/`write`, `expiresAt`, el plano solo en la respuesta de creación) | B2B | cli ✓ (`ft api-keys`), mcp ✓ (solo list) | [freeticket-cli#29](https://github.com/AppFreeticket/freeticket-cli/issues/29) | shipped |
Evidence
El encabezado del ledger y la guía de endpoint-requester establecen que la columna es para issues de
free-admin, pero las nuevas filas introducen links a issues de freeticket-cli en esa misma columna.

CONTRACT-GAPS.md[15-16]
CONTRACT-GAPS.md[34-36]
.claude/agents/endpoint-requester.md[76-84]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
La columna “Issue free-admin” ahora contiene links a issues de otros repos (p.ej. freeticket-cli), lo que vuelve el ledger ambiguo para el proceso de `endpoint-requester`.

### Issue Context
`endpoint-requester` documenta explícitamente la tabla con la columna “Issue free-admin” y el cruce de enlaces con issues en `AppFreeticket/free-admin`.

### Fix Focus Areas
- CONTRACT-GAPS.md[15-16]
- CONTRACT-GAPS.md[34-38]
- .claude/agents/endpoint-requester.md[76-84]

### Suggested change
- **Opción A (mínimo cambio):** mantener la columna como “Issue free-admin” y mover los links de CLI a la columna “Cliente” o al texto de “Funcionalidad”, dejando `—` en la columna de free-admin cuando no aplique.
- **Opción B (más claro):** renombrar la columna a “Issue/Tracking” (o agregar una columna adicional para “Issue cliente”) y actualizar la plantilla en `endpoint-requester.md` para reflejar la nueva estructura.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

4. Paths admin con prefijo mixto 🐞 Bug ⚙ Maintainability
Description
En el ledger se documentan endpoints admin con prefijo /api/admin mientras el resto de docs usa
paths relativos al contrato (p.ej. /workspaces/{id}). Esta mezcla hace ambiguo si se está listando
el path del spec o la URL completa del backend.
Code

CONTRACT-GAPS.md[35]

+| Service token de plataforma para `ft admin` headless — el superadmin solo tenía la cookie de sesión del browser | `GET/POST/DELETE /api/admin/tokens` | Admin | cli ✓ (`ft admin tokens`), mcp ✓ (solo list) | — | shipped |
Evidence
Las nuevas filas introducen /api/admin/... en el ledger, mientras el roadmap para admin lista los
mismos recursos como /workspaces/{id} (relativo).

CONTRACT-GAPS.md[35-39]
ROADMAP-AI-FIRST.md[137-141]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
El ledger mezcla notación de paths: algunas filas admin usan `/api/admin/...` y otras docs (roadmap) usan `/...` relativo al spec.

### Issue Context
Para evitar confusiones (especialmente al pedir endpoints vía `endpoint-requester`), conviene tener una única convención: o siempre paths relativos al contrato, o siempre URLs con prefijo.

### Fix Focus Areas
- CONTRACT-GAPS.md[35-39]
- ROADMAP-AI-FIRST.md[137-141]

### Suggested change
- Elegir una convención y aplicarla consistentemente:
 - **Opción A (recomendada):** paths relativos al contrato (sin `/api/admin`), ej. `GET/POST/DELETE /tokens`, `PATCH /workspaces/{id}`, `POST /workspaces/{id}/plan`.
 - **Opción B:** mantener prefijo en todas las filas admin y documentar explícitamente la base (`/api/admin`) en el encabezado/nota del ledger.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

Comment thread CONTRACT-GAPS.md
Comment on lines +33 to +34
| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped |
| API key de servicio self-service — un cron server-side (Vercel) no puede usar el device flow interactivo, y no había forma de acuñar una `ft_live_…` sin entrar al backend | `GET/POST/DELETE /api-keys` (scope `read`/`write`, `expiresAt`, el plano solo en la respuesta de creación) | B2B | cli ✓ (`ft api-keys`), mcp ✓ (solo list) | [freeticket-cli#29](https://github.com/AppFreeticket/freeticket-cli/issues/29) | shipped |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. contract-gaps.md not in english 📘 Rule violation ⚙ Maintainability

The PR adds/updates technical documentation content in Spanish, but repository documentation must be
written in English. This breaks the repo’s documentation language/locale convention and reduces
consistency for the intended audience.
Agent Prompt
## Issue description
Technical documentation updates in `CONTRACT-GAPS.md` are written in Spanish, but repo documentation must be in English.

## Issue Context
Per the documentation language/locale convention, technical documentation should be English (end-user copy may be neutral Spanish).

## Fix Focus Areas
- CONTRACT-GAPS.md[33-39]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread CONTRACT-GAPS.md

| Authorization server OAuth 2.1 para el MCP remoto — claude.ai exige OAuth para connectors con credenciales. Resuelto **embebiendo el AS en el propio mcp** (v0.10.0): tokens stateless que sellan API key + workspace + sesión admin; no requirió endpoint nuevo en free-admin. `FT_OAUTH_ISSUER` permite delegar a un AS de free-admin si algún día existe | `/.well-known/oauth-authorization-server` (RFC 8414), dynamic client registration (RFC 7591), `/authorize` + `/token` con PKCE y página de consentimiento — todo servido por el mcp | B2B | mcp ✓ | — | shipped |
| Update endpoints sin `requestBody` en el spec — el mcp no puede tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedan fuera de la Ola B | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — declarar `requestBody` (schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate`) | B2B | mcp | — | identified |
| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

2. Roadmap quedó desactualizado 🐞 Bug ⚙ Maintainability

CONTRACT-GAPS.md marca como shipped el gap de updates sin requestBody, pero ROADMAP-AI-FIRST.md
todavía deja event_dates_create/update, ticket_types_update, plans_update y venues_update
como pendientes por ese mismo gap. Esto introduce drift de documentación y puede llevar a trabajo
duplicado o a creer que la Ola B sigue bloqueada.
Agent Prompt
### Issue description
El roadmap sigue afirmando que varios tools están bloqueados por el gap “sin requestBody”, pero el ledger ya lo marcó `shipped`.

### Issue Context
El PR cambia el estado del gap a `shipped` en `CONTRACT-GAPS.md`, pero no actualiza el roadmap donde esos items figuran como pendientes.

### Fix Focus Areas
- ROADMAP-AI-FIRST.md[75-103]
- CONTRACT-GAPS.md[33-33]

### Suggested change
- Marcar como completados (`[x]`) los items `event_dates_create`, `event_dates_update`, `ticket_types_update`, `plans_update`, `venues_update`.
- Remover la nota “hueco de contrato (sin requestBody)” o reemplazarla por una nota histórica (opcional) que apunte al contrato 1.5.0.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread CONTRACT-GAPS.md
| Update endpoints sin `requestBody` en el spec — el mcp no puede tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedan fuera de la Ola B | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — declarar `requestBody` (schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate`) | B2B | mcp | — | identified |
| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped |
| API key de servicio self-service — un cron server-side (Vercel) no puede usar el device flow interactivo, y no había forma de acuñar una `ft_live_…` sin entrar al backend | `GET/POST/DELETE /api-keys` (scope `read`/`write`, `expiresAt`, el plano solo en la respuesta de creación) | B2B | cli ✓ (`ft api-keys`), mcp ✓ (solo list) | [freeticket-cli#29](https://github.com/AppFreeticket/freeticket-cli/issues/29) | shipped |
| Service token de plataforma para `ft admin` headless — el superadmin solo tenía la cookie de sesión del browser | `GET/POST/DELETE /api/admin/tokens` | Admin | cli ✓ (`ft admin tokens`), mcp ✓ (solo list) | — | shipped |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Informational

3. Paths admin con prefijo mixto 🐞 Bug ⚙ Maintainability

En el ledger se documentan endpoints admin con prefijo /api/admin mientras el resto de docs usa
paths relativos al contrato (p.ej. /workspaces/{id}). Esta mezcla hace ambiguo si se está listando
el path del spec o la URL completa del backend.
Agent Prompt
### Issue description
El ledger mezcla notación de paths: algunas filas admin usan `/api/admin/...` y otras docs (roadmap) usan `/...` relativo al spec.

### Issue Context
Para evitar confusiones (especialmente al pedir endpoints vía `endpoint-requester`), conviene tener una única convención: o siempre paths relativos al contrato, o siempre URLs con prefijo.

### Fix Focus Areas
- CONTRACT-GAPS.md[35-39]
- ROADMAP-AI-FIRST.md[137-141]

### Suggested change
- Elegir una convención y aplicarla consistentemente:
  - **Opción A (recomendada):** paths relativos al contrato (sin `/api/admin`), ej. `GET/POST/DELETE /tokens`, `PATCH /workspaces/{id}`, `POST /workspaces/{id}/plan`.
  - **Opción B:** mantener prefijo en todas las filas admin y documentar explícitamente la base (`/api/admin`) en el encabezado/nota del ledger.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread CONTRACT-GAPS.md
| Authorization server OAuth 2.1 para el MCP remoto — claude.ai exige OAuth para connectors con credenciales. Resuelto **embebiendo el AS en el propio mcp** (v0.10.0): tokens stateless que sellan API key + workspace + sesión admin; no requirió endpoint nuevo en free-admin. `FT_OAUTH_ISSUER` permite delegar a un AS de free-admin si algún día existe | `/.well-known/oauth-authorization-server` (RFC 8414), dynamic client registration (RFC 7591), `/authorize` + `/token` con PKCE y página de consentimiento — todo servido por el mcp | B2B | mcp ✓ | — | shipped |
| Update endpoints sin `requestBody` en el spec — el mcp no puede tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedan fuera de la Ola B | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — declarar `requestBody` (schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate`) | B2B | mcp | — | identified |
| Update endpoints sin `requestBody` en el spec — el mcp no podía tipar el cuerpo, así que `event_dates_create/update`, `ticket_types_update`, `plans_update` y `venues_update` quedaban fuera de la Ola B. **Resuelto en el contrato 1.5.0**: los cinco schemas existen y el mcp los expone (v0.12.0) | `POST /events/{id}/dates`, `PATCH /events/{id}/dates/{dateId}`, `PATCH /ticket-types/{id}`, `PATCH /membership-plans/{id}`, `PATCH /venues/{id}` — schemas `EventDateCreate/Update`, `TicketTypeUpdate`, `MembershipPlanUpdate`, `VenueUpdate` | B2B | mcp ✓ | — | shipped |
| API key de servicio self-service — un cron server-side (Vercel) no puede usar el device flow interactivo, y no había forma de acuñar una `ft_live_…` sin entrar al backend | `GET/POST/DELETE /api-keys` (scope `read`/`write`, `expiresAt`, el plano solo en la respuesta de creación) | B2B | cli ✓ (`ft api-keys`), mcp ✓ (solo list) | [freeticket-cli#29](https://github.com/AppFreeticket/freeticket-cli/issues/29) | shipped |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

4. Columna de issues ambigua 🐞 Bug ⚙ Maintainability

La tabla define la 5ª columna como “Issue free-admin”, pero se agregaron filas que enlazan issues de
freeticket-cli en esa columna. Esto rompe la semántica declarada del ledger y el workflow descrito
por endpoint-requester (gap ↔ issue en free-admin).
Agent Prompt
### Issue description
La columna “Issue free-admin” ahora contiene links a issues de otros repos (p.ej. freeticket-cli), lo que vuelve el ledger ambiguo para el proceso de `endpoint-requester`.

### Issue Context
`endpoint-requester` documenta explícitamente la tabla con la columna “Issue free-admin” y el cruce de enlaces con issues en `AppFreeticket/free-admin`.

### Fix Focus Areas
- CONTRACT-GAPS.md[15-16]
- CONTRACT-GAPS.md[34-38]
- .claude/agents/endpoint-requester.md[76-84]

### Suggested change
- **Opción A (mínimo cambio):** mantener la columna como “Issue free-admin” y mover los links de CLI a la columna “Cliente” o al texto de “Funcionalidad”, dejando `—` en la columna de free-admin cuando no aplique.
- **Opción B (más claro):** renombrar la columna a “Issue/Tracking” (o agregar una columna adicional para “Issue cliente”) y actualizar la plantilla en `endpoint-requester.md` para reflejar la nueva estructura.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Shipped: los 5 updates que no declaraban requestBody (desbloquean la Ola B del
mcp), api-keys self-service, tokens de plataforma, y liquidaciones
(/settlements + /reports/financials).

Nuevos huecos anotados, los tres verificados contra el spec en vivo:
- PDF de comprobante de liquidación: hay hasDocument y fileName, no URL de
  descarga. El archivo sigue siendo solo del panel.
- GET /staff sin batch cross-workspace: N+1 real; el fan-out del mcp tapa el
  síntoma pero siguen siendo N round trips.
- Onboarding enterprise: PATCH /api/admin/workspaces/{id} no acepta webTemplate
  ni customDomain, y no existe la asignación manual de plan.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@LucasLeguizamo
LucasLeguizamo force-pushed the docs/contract-gaps-1.5 branch from 860c7c4 to fa0972c Compare August 3, 2026 23:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant