A prototype agent on the Agentic Enterprise Command Center. It books a court, table, pitch or room from a plain-language request, for a group, and stops for a person before any payment. It uses a sample booking site built on public information, with sample prices. Not connected to ActiveSG or any real booking system. Every guardrail below is enforced in code and proven by an automated test that fails the build if the code stops enforcing it.
| Guardrail | Why it matters | Enforced in | Reference |
|---|---|---|---|
| Message length limit Messages over the limit are refused before they reach the AI. | Very long inputs cost money and are a common way to smuggle instructions in. | input-guard.js | OWASP LLM10 Unbounded consumption OWASP LLM01 Prompt injection |
| No NRIC, phone or card numbers A message containing an NRIC, a phone number or a card number is refused. It is never sent to the AI and never stored; the log records only that it was refused. | A booking does not need personal identifiers, so collecting them would be a liability, not a feature. | input-guard.js | PDPA, NRIC guidelines OWASP LLM02 Sensitive information disclosure |
| Prompt-injection screen Phrases like "ignore your rules" are flagged in amber. The screen is only a warning light: the rules that actually stop a bad booking are in code, further down. | No filter catches every trick, so it must never be the thing you rely on. | input-guard.js | OWASP LLM01 Prompt injection AI Verify: security |
| Runs per visitor per day Each visitor can start a limited number of runs a day. | A public demo that calls a paid AI model must not be something one person can run all day. | workflow.js | OWASP LLM10 Unbounded consumption |
| Daily AI spending cap All visitors together can spend at most US$1 a day on AI. The cost is reserved before each call and recorded after it. At the cap, the agent stops calling the paid model. | A cost cap has to hold even when many people use the demo at once. | model-router.js, ai-lane.js | OWASP LLM10 Unbounded consumption IMDA MAIGF: operations management |
| The AI's reading of your request is checked The AI must answer in a fixed shape with allowed values only: a known activity, 1 to 40 people, sensible hours. Anything else is refused, not guessed at. | Treating AI output as trusted input is how agents end up doing things nobody asked for. | schema.js | OWASP LLM05 Improper output handling AI Verify: robustness |
| Looking cannot book The tools used to read the facilities and the calendars can only read. Booking and paying are separate tools, used only after approval. | An agent should have no more power at each step than that step needs. | steps.js | OWASP LLM06 Excessive agency AI Verify: security |
| Your own account only The account comes from your session, never from your message or the AI's answer. The booking site refuses any other account. | If an agent could be talked into acting on someone else's account, it would be a tool for fraud. | steps.js, site.js | OWASP LLM06 Excessive agency AI Verify: security |
| Only days the site lists The demo booking site lists Saturday 15 November only. A request for another day is answered honestly, not forced onto Saturday. | An agent that quietly changes what you asked for is worse than one that says no. | steps.js | AI Verify: transparency |
| One booking a week Each account can hold one booking a week. The agent checks before choosing, and the booking site checks again when booking. | Fair access: one person should not be able to hoard courts. | steps.js, site.js | Booking policy of the (mock) facility |
| One court, table or room per booking A booking is for one court, one table, one pitch or one room. Asking for ten is refused by code, whatever the AI says. | This is the rule an "ignore your rules" message is usually trying to break. | steps.js | Booking policy of the (mock) facility OWASP LLM06 Excessive agency |
| At most 2 hours A booking is at most 2 hours. Longer requests are refused before choosing, and the chosen option is checked again. | Fair access, and a simple rule the AI must not talk its way around. | steps.js, checks.js | Booking policy of the (mock) facility |
| The facility fits the group Every facility has a minimum and maximum number of players. A badminton court cannot be booked for ten. | The AI may suggest something that sounds right and does not fit. | steps.js, checks.js | Booking policy of the (mock) facility AI Verify: robustness |
| No invented courts or slots The AI must choose from the options it was given. If it names a court or a time the site did not offer, its answer is refused. | AI models can state made-up things with complete confidence. | checks.js | OWASP LLM09 Misinformation AI Verify: robustness |
| Everyone can actually make it The chosen time must start after everyone's last commitment plus travel time, and end before their next one. Code checks this itself rather than trusting the AI's arithmetic. | A slot that looks free on the clock can still be impossible to reach. | checks.js | AI Verify: robustness |
| Within the budget The total price, shared by the group, must be within the budget each person gave. | Spending limits are the user's, and the agent must not stretch them. | checks.js | Booking policy of the (mock) facility |
| No made-up numbers in the reason Every number in the AI's explanation must be one the agent gave it: a real time, price or court number. A figure from nowhere means the answer is refused. | An explanation with an invented price is misinformation, even if the choice itself is fine. | checks.js | OWASP LLM09 Misinformation AI Verify: transparency |
| The price comes from the site, not the AI What you are asked to approve is calculated by code from the site's price list. The AI's words cannot change the amount. | A model that misread a price must not be able to change what gets paid. | steps.js | OWASP LLM05 Improper output handling AI Verify: accountability |
| No automatic retries If the AI's answer fails a check, the agent stops and says why. It does not keep asking until it gets an answer it likes. | Retrying until something passes hides the failure the check was there to show. | steps.js | AI Verify: accountability |
| An AI "nothing fits" is checked too If the AI says nothing fits, code checks every option itself. If one passes every rule, you are shown it, with a note that the AI missed it. You still decide. | Checks must catch an AI that is wrong in either direction: inventing an option, or missing a real one. | steps.js | AI Verify: robustness OWASP LLM09 Misinformation |
| No payment without your approval Pressing Approve creates a one-time token tied to this run, this slot and this exact amount. The wallet refuses any charge without it, and refuses it a second time. | A person stays in control of money, and an approval cannot be reused for something else. | site.js, wallet.js, approval-token.js | IMDA MAIGF: level of human involvement AI Verify: human agency and oversight OWASP LLM06 Excessive agency |
| Every step is on the record The run log keeps every step, every check and which AI answered. Refused messages are logged as refused, without their content. | If you cannot show what the agent did and why, you cannot govern it. | log.js | AI Verify: accountability AI Verify: transparency |
References: OWASP = OWASP Top 10 for LLM Applications (2025). IMDA MAIGF = IMDA Model AI Governance Framework. AI Verify = AI Verify testing framework principles. PDPA, NRIC guidelines = Personal Data Protection Act, and PDPC Advisory Guidelines on NRIC numbers. Generated from spec-catalogue.js, the same source the demo's side panel reads.