{"ok":true,"site":{"host":"constraint-canvas-rho.vercel.app","url":"https://constraint-canvas-rho.vercel.app/","type":"live","desc":"A shared floor planner where every rejected agent proposal becomes a permanent rule the agent cannot break again.","tools":[{"name":"get_floor_plan","kind":"answer","impl":"imperative","description":"Return the complete current floor plan: room dimensions, grid size, capacity, and every object with its id, kind, position in metres, footprint, seat count and lock status. Call this before proposing anything.","title":"Read the floor plan","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"include_catalog":{"type":"boolean","description":"Also return the catalogue of object kinds that can be placed, with their footprints and seat counts."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_rulebook","kind":"answer","impl":"imperative","description":"Return every constraint currently governing this floor: the built-in planning rules that ship with the app and the rules the human has authored during this session, each with its plain language statement, its origin and whether it is active. Every proposal you make is validated against this list before it can be shown to the human.","title":"Read the rulebook","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"include_disabled":{"type":"boolean","description":"Include rules the human has waived. Defaults to false."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_violations","kind":"answer","impl":"imperative","description":"Return everything that is currently broken on the floor and by how much. Use this to find work worth doing, and to confirm a plan actually improved things.","title":"Read current violations","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_metrics","kind":"answer","impl":"imperative","description":"Return seat count against capacity, floor area used, circulation share, the distance from the furthest seat to the nearest exit, and the live violation count.","title":"Read utilisation figures","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_pending_proposal","kind":"answer","impl":"imperative","description":"Return the proposal currently waiting on a human decision, if any, with the status of each item. Only one proposal can be pending at a time, so check here if a submission was turned away as blocked.","title":"Check what is awaiting approval","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_changes","kind":"act","impl":"imperative","description":"Submit a set of placements, moves or removals. This never edits the floor directly. The app validates the whole set against locked objects and every active rule. If any item breaks a rule the entire plan is refused and you are told which rule and which item. If it passes, it appears as a ghosted preview for the human to accept or reject item by item.","title":"Propose changes to the floor","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"summary":{"type":"string","description":"One sentence in plain language describing what this plan does and why, shown to the human above the items."},"changes":{"type":"array","description":"The changes to apply, evaluated as one atomic plan.","items":{"type":"object","properties":{"op":{"type":"string","enum":["add","move","remove"]},"kind":{"type":"string","enum":["stage","round_table","rect_table","booth","bar","exit","walkway"],"description":"Required for add. The type of object to place."},"id":{"type":"string","description":"Required for move and remove. An existing object id."},"x":{"type":"number","description":"Left edge in metres from the north west corner. Required for add and move."},"y":{"type":"number","description":"Top edge in metres from the north west corner. Required for add and move."},"label":{"type":"string","description":"Optional name for a new object."}},"required":["op"]}}},"required":["summary","changes"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"optimise_layout","kind":"act","impl":"imperative","description":"Ask the app to lay out the unlocked part of the floor against an objective. Locked objects are never touched and every candidate position is tested against the live rulebook before it is offered. Returns a proposal awaiting human approval, never a direct change.","title":"Optimise the unlocked floor","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"objective":{"type":"string","enum":["maximise_seating","widen_circulation","improve_sightlines"],"description":"What to optimise for."},"target_seats":{"type":"number","description":"For maximise_seating, how many extra seats to aim for. Defaults to 40."},"object_kind":{"type":"string","enum":["round_table","rect_table"],"description":"For maximise_seating, which seating type to add. Defaults to round_table."}},"required":["objective"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"explain_placement","kind":"act","impl":"imperative","description":"Given an object kind and a position, report whether it can go there and, if not, exactly which rules it breaks, which neighbouring objects are involved and by what margin. Use this to answer a human asking why something will not fit, and to debug your own refused plans.","title":"Explain why a placement fails","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"object_kind":{"type":"string","enum":["stage","round_table","rect_table","booth","bar","exit","walkway"]},"x":{"type":"number","description":"Left edge in metres."},"y":{"type":"number","description":"Top edge in metres."}},"required":["object_kind","x","y"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_rule","kind":"act","impl":"imperative","description":"Turn a plain language planning instruction from the human into a structured rule and send it to them for one tap confirmation. You cannot add, edit or delete rules yourself. This only drafts one. Nothing is enforced until the human ratifies it in the rulebook panel.","title":"Draft a rule for the human to confirm","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"instruction":{"type":"string","description":"The instruction in the human's own words, for example: never put standing tables near the entrance."}},"required":["instruction"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"apiSurface":"spec","category":"Productivity & Business","toolCount":9}}