{"templateId":"markdown","sharedDataIds":{},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"B2B v2 Coverage Expansion: Next Session Plan","description":"Official Altegio API documentation for integrating online booking, CRM, scheduling, POS, and business management features into your applications.","siteUrl":"https://developer.alteg.io","lang":"en","keywords":["Altegio API","REST API","online booking API","appointment scheduling API","business management API","CRM integration","POS API"],"image":"/assets/og-image.5c9c342f49e4dd72b96f7a0faf29bb71fab6ff06bbf97cf4b230d6fcc0abcdb3.e746d8a7.jpg","meta":[{"name":"author","content":"Altegio"},{"name":"twitter:card","content":"summary_large_image"},{"name":"twitter:site","content":"@altegio"}],"llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"b2b-v2-coverage-expansion-next-session-plan","__idx":0},"children":["B2B v2 Coverage Expansion: Next Session Plan"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Status:"]}," Ready for implementation"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Audit snapshot:"]}," 2026-07-16"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Documentation repository baseline:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["608bb35"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Backend repository baseline:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["22e478446e8"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["origin/master"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Scope:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.alteg.io/api/v2"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/b2b-v2/openapi.yaml"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"outcome","__idx":1},"children":["Outcome"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Expand the published B2B v2 reference without accidentally promoting internal"," ","backoffice routes to the public contract."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The next session must:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["publish canonical Location URLs for Tags and Positions;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["refresh and classify the 28-operation documentation gap;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["publish at least the safe Waiting List read surface; and"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["publish the complete Waiting List group only when a controlled fixture makes"," ","positive write verification safe."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Minimum success increases coverage from 32 of 60 operations to 34 of 60."," ","Target success increases it to 39 of 60."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"current-baseline","__idx":2},"children":["Current baseline"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The backend registers 60 ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/v2"]}," operations in two route files:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["53 operations in"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["src/Application/Http/Routing/Routes/api/api_v2.php"]},";"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["7 operations in"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["src/Application/Http/Routing/Routes/api/modules/waiting_list.php"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The published B2B v2 reference contains 22 paths and 32 operations:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Method"},"children":["Method"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"right","data-label":"Backend"},"children":["Backend"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"right","data-label":"Published"},"children":["Published"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"right","data-label":"Gap"},"children":["Gap"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["GET"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["35"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["18"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["17"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["POST"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["10"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["5"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["5"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["PUT"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["6"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["2"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["PATCH"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["2"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["1"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["DELETE"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["7"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Total"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["60"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["32"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["28"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The 28 unpublished operations currently fall into these groups:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Candidate group"},"children":["Candidate group"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"right","data-label":"Operations"},"children":["Operations"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Initial handling"},"children":["Initial handling"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Waiting List"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["7"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["First public expansion candidate"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Attendance and related statistics"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["10"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Classify before publication"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Attendance Services"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Classify before publication"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Comer Vehicles"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["4"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Treat as internal until proven otherwise"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Units, Resource Occupations, Custom Fields"]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"right"},"children":["3"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Assess as public reference data"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is a mechanical route inventory, not proof that all 60 operations belong"," ","in the public B2B contract."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"contract-facts-already-established","__idx":3},"children":["Contract facts already established"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Every request must send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Accept: application/vnd.api.v2+json"]}," and combined"," ","Partner plus Business User authorization."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Backend routes are registered under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/locations/{locationId}"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ApiUrlAliasRewriteMiddleware"]}," maps the compatibility segment ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["companies"]}," to"," ","the canonical segment ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["locations"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Production currently resolves both Tags and Positions URL forms through the"," ","authentication layer."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The published spec still uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/companies/{company_id}"]}," for the ten Tags and"," ","Positions operations."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Canonical prose uses Location, Team Member, Appointment, Booking User, and"," ","Business User."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Literal SDK-facing parameter names such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["company_id"]}," remain unchanged and"," ","are described with canonical domain terminology."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Literal wire values such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["good"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["staff"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["record"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["activity"]},", and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client"]}," must remain unchanged and be identified as wire values."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An unauthenticated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["401"]}," proves route reachability only. It does not prove that"," ","two URLs return the same successful contract."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"scope-rules","__idx":4},"children":["Scope rules"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Work only in B2B v2 files and the related validation workflows."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Do not document an endpoint merely because it is registered under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/v2"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Treat Vue-only consumers, backoffice-specific state, and unstable internal"," ","handlers as evidence against public publication."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use production behavior as the source of truth, supported by current PHP"," ","controllers, transformers, services, and integration tests."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Preserve literal request keys, response keys, enum values, resource types,"," ","and compatibility aliases."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Do not expose credentials, personal data, or raw production payloads."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Do not create or modify a Booking User or Waiting List entry without a"," ","controlled fixture and an explicit cleanup path."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Keep documented, source-verified, live-verified, and blocked evidence separate."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-refresh-the-inventory","__idx":5},"children":["Step 1: Refresh the inventory"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before editing, fetch both repositories and recount from their current default"," ","branches. Do not assume the snapshot above is still current."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For every backend operation, record:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["HTTP method and canonical route;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["route name and controller;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["existing OpenAPI operation ID, if any;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["known application consumers;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["authentication and permission middleware;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["integration-test coverage;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["candidate classification: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["public"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["internal"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["needs decision"]},";"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["evidence level: source-only, integration-tested, route-reachable, or positive"," ","production response."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Save the refreshed table in this plan or a sibling dated inventory file. The"," ","published coverage denominator must include only approved public operations;"," ","also retain the raw 60-operation denominator for engineering visibility."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-canonicalize-tags-and-positions","__idx":6},"children":["Step 2: Canonicalize Tags and Positions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Perform authenticated read checks for both forms:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"/api/v2/locations/{company_id}/tags\n/api/v2/companies/{company_id}/tags\n/api/v2/locations/{company_id}/positions\n/api/v2/companies/{company_id}/positions\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the canonical Location URLs return the same successful resources:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["publish only ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/locations/{company_id}/tags"]}," and"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/locations/{company_id}/positions"]}," as primary paths;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["rename the four path files from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["company.*"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["location.*"]},";"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["preserve the literal ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["company_id"]}," OpenAPI parameter name and describe it as"," ","the Location identifier;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["keep ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/companies/{company_id}"]}," in a short compatibility note instead of"," ","duplicating ten OpenAPI operations;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["keep operation IDs and verified wire payloads stable;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["update any Arazzo or validation reference that hard-codes the old URL."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If an authenticated canonical request fails, stop this step and record the"," ","exact production/backend mismatch. Do not change the spec based only on the"," ","unauthenticated route check."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-publish-the-safe-waiting-list-read-surface","__idx":7},"children":["Step 3: Publish the safe Waiting List read surface"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The backend exposes:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"GET    /locations/{location_id}/waiting_list\nGET    /locations/{location_id}/waiting_list/count\nPOST   /locations/{location_id}/waiting_list\nGET    /locations/{location_id}/waiting_list/{waiting_list_entry_id}\nPUT    /locations/{location_id}/waiting_list/{waiting_list_entry_id}\nPOST   /locations/{location_id}/waiting_list/{waiting_list_entry_id}/finish\nDELETE /locations/{location_id}/waiting_list/{waiting_list_entry_id}\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Start with the two collection reads because they do not require mutation:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["verify positive list and count responses in production;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["reconcile the responses with the current controllers, transformers, and"," ","integration tests;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["replace stale prose such as Client with Booking User while keeping literal"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["staff"]}," wire names in code formatting;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["add 401, 403, and 404 responses plus the actual validation responses;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["register only the verified GET operations in"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/b2b-v2/openapi.yaml"]},";"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["add both reads to the safe Arazzo workflow and require ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["200"]},", never ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]},","," ","as proof of availability."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Minimum acceptance for this step is 34 published operations with no unverified"," ","write contract implied by the reference."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-complete-waiting-list-only-when-safe","__idx":8},"children":["Step 4: Complete Waiting List only when safe"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before documenting the remaining five operations as production-verified,"," ","confirm all of the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["a controlled test Booking User is available;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["create and update cannot change real customer data;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["finish does not send a notification or trigger an unsafe workflow;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["a unique run marker can identify the temporary entry;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["delete is available as cleanup after every post-create failure;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["a final list query can prove that the entry no longer exists."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When those conditions hold:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["run create, read, update, finish, and delete against the controlled fixture;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["capture only sanitized shapes and validation behavior;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["finish the request and response schemas from observed production behavior;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["register all five operations;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["add a self-cleaning Arazzo CRUD workflow with failure cleanup; and"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["verify that no temporary entry remains."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If any safety condition is missing, stop at the read-only expansion. Document"," ","the exact missing fixture or safety guarantee. Do not substitute a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}," probe"," ","for a positive write contract."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Target acceptance for this step is 39 published operations."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-classify-the-remaining-21-operations","__idx":9},"children":["Step 5: Classify the remaining 21 operations"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After Waiting List, rank the remaining groups using these criteria:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["confirmed external integration use;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["stable controller and transformer contract;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["clear Partner and Business User authorization semantics;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["safe positive production verification;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["canonical domain terminology;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["maintainable Arazzo coverage;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["absence of backoffice-only state or UI coupling."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Recommended investigation order:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Units, Resource Occupations, and Custom Fields;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Attendance Services;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Attendance reads and statistics;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Comer Vehicles;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Attendance mutations, pins, and other UI-state operations."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not increase the public denominator for routes classified as internal."," ","Record that exclusion explicitly so later audits do not repeatedly rediscover"," ","the same routes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"files-to-inspect-before-editing","__idx":10},"children":["Files to inspect before editing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Documentation repository:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/b2b-v2/openapi.yaml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/paths/tags/v2/*.yml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/paths/positions/v2/*.yml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/paths/waiting_list/*.yml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/en/schemas/waiting_list/*.yml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/api-fast-check-b2b-v2.arazzo.yaml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/api-crud-check-b2b-v2.arazzo.yaml"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scripts/check-b2b-v2-arazzo.mjs"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Backend repository:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["src/Application/Http/Routing/Routes/api/api_v2.php"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["src/Application/Http/Routing/Routes/api/modules/waiting_list.php"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["src/Application/Http/Routing/ApiPathAliasRegistry.php"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["src/Application/Http/Middleware/Api/ApiUrlAliasRewriteMiddleware.php"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Waiting List controllers, transformers, services, and integration tests"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Read every target file before changing it and search for references before"," ","renaming any path file."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"validation","__idx":11},"children":["Validation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Run at minimum:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"npm test\n./node_modules/.bin/redocly lint docs/en/b2b-v2/openapi.yaml\ntools/content-scan.sh\ngit diff --check\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If Arazzo changes:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"make test-api-b2b-v2\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Also:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["recount source and bundled paths and operations;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["verify every newly published operation has 401, 403, and 404;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["inspect the rendered Tags, Positions, and Waiting List pages;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["search prose for Company, Client, Staff, Record, Good, and Activity, allowing"," ","them only as explicitly identified wire literals or compatibility paths;"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["report production writes and cleanup separately from lint and source review."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"definition-of-done","__idx":12},"children":["Definition of done"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tags and Positions publish canonical Location URLs after authenticated proof."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Compatibility ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/companies"]}," URLs remain explained without duplicated methods."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The raw backend inventory and the approved public denominator are both known."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["At least the two Waiting List collection reads are published and live-verified."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Full Waiting List CRUD is published only when controlled positive verification"," ","and cleanup are complete."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Every remaining route is marked public, internal, or needs decision."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Redocly reports no B2B v2 warnings and the repository baseline does not regress."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["No credentials, personal data, or temporary fixtures remain."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The final report states the new numerator and denominator and distinguishes"," ","documented, source-verified, live-verified, and blocked operations."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"copy-ready-prompt-for-the-next-session","__idx":13},"children":["Copy-ready prompt for the next session"]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Implement"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["docs/plans/2026-07-16-b2b-v2-coverage-expansion.md"]},". Refresh both repositories"," ","first and preserve unrelated work. Canonicalize Tags and Positions only after"," ","authenticated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/locations"]}," checks. Rebuild the 60-operation route inventory,"," ","classify the 28-operation gap, and publish at least the safe Waiting List list"," ","and count reads. Complete Waiting List writes only with a controlled Booking"," ","User fixture, notification safety, and guaranteed cleanup. Preserve literal"," ","wire values, use canonical prose, run all required lint and Arazzo checks, open"," ","a focused PR, and report the final coverage ratio plus documented,"," ","live-verified, internal, and blocked operations separately."]}]}]},"headings":[{"value":"B2B v2 Coverage Expansion: Next Session Plan","id":"b2b-v2-coverage-expansion-next-session-plan","depth":1},{"value":"Outcome","id":"outcome","depth":2},{"value":"Current baseline","id":"current-baseline","depth":2},{"value":"Contract facts already established","id":"contract-facts-already-established","depth":2},{"value":"Scope rules","id":"scope-rules","depth":2},{"value":"Step 1: Refresh the inventory","id":"step-1-refresh-the-inventory","depth":2},{"value":"Step 2: Canonicalize Tags and Positions","id":"step-2-canonicalize-tags-and-positions","depth":2},{"value":"Step 3: Publish the safe Waiting List read surface","id":"step-3-publish-the-safe-waiting-list-read-surface","depth":2},{"value":"Step 4: Complete Waiting List only when safe","id":"step-4-complete-waiting-list-only-when-safe","depth":2},{"value":"Step 5: Classify the remaining 21 operations","id":"step-5-classify-the-remaining-21-operations","depth":2},{"value":"Files to inspect before editing","id":"files-to-inspect-before-editing","depth":2},{"value":"Validation","id":"validation","depth":2},{"value":"Definition of done","id":"definition-of-done","depth":2},{"value":"Copy-ready prompt for the next session","id":"copy-ready-prompt-for-the-next-session","depth":2}],"frontmatter":{"seo":{"title":"B2B v2 Coverage Expansion: Next Session Plan"}},"lastModified":"2026-07-16T17:48:42.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/plans/2026-07-16-b2b-v2-coverage-expansion","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}