← Files Pushing Tin over GraftonARCHIVED FILE
plugin.json
15.1 KB · Nov 6, 2026 · 00:16 UTC
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "grafton-atc",
"version": "1.0.15",
"description": "Take the controller\u2019s seat in a real-time air traffic control simulation. Hear pilots, guide aircraft and see your decisions unfold, with ChatGPT as your coach. Start with guided lessons or put your skills to work in free-play scenarios.",
"author": {
"name": "Grafton Machine Shed",
"email": "admin@grafton.ai",
"url": "https://www.grafton.ai"
},
"homepage": "https://atc.grafton.ai",
"repository": "https://github.com/GrantSparks/grafton-atc",
"extensions": {
"com.openai": {
"interface": {
"displayName": "Pushing Tin over Grafton",
"shortDescription": "Learn air traffic control",
"longDescription": "Take the controller\u2019s seat.\n\nPilots are waiting. Aircraft are moving. What happens next depends on your decisions.\n\nDiscover the challenge and satisfaction of air traffic control, with ChatGPT as your coach. Learn the basics through guided lessons, then put your judgement to work as the traffic\u2014and the pressure\u2014builds.\n\nNo prior air traffic control knowledge is needed. Start with one aircraft and time to get your bearings. Ask questions in everyday language, talk through your choices and give instructions. Hear the pilots\u2019 replies and watch the aircraft respond. Pause to discuss a decision, review what happened or try a different approach.\n\nBuild a plan for arrivals and departures, keep aircraft safely apart and adapt when conditions change. When the wind shifts or an aircraft needs another attempt at landing, adapt your plan while other pilots still need your attention. Radar and tower displays inspired by Australian air traffic control put you at a simulated Australian airport, where timing, listening and judgement matter.\n\nAlready know the basics? Choose a free-play scenario and put your skills to work with busier traffic and more demanding situations, including aircraft emergencies.\n\nAll aircraft, radio exchanges and airport systems are simulated. Game journals support replay, review and internal AI training; see the privacy policy for details.",
"developerName": "Grafton Machine Shed",
"category": "Entertainment",
"capabilities": [
"Learn air traffic control with a coach",
"Guide aircraft through takeoffs and landings",
"Hear pilot replies and watch your decisions unfold",
"Handle changing traffic and unexpected situations",
"Explore free-play scenarios",
"Review decisions and try a different approach"
],
"websiteURL": "https://atc.grafton.ai",
"supportURL": "https://atc.grafton.ai/support",
"privacyPolicyURL": "https://atc.grafton.ai/privacy",
"termsOfServiceURL": "https://atc.grafton.ai/terms",
"defaultPrompt": [
"Teach me air traffic control. Start with a beginner lesson.",
"Help me understand the display in a guided lesson.",
"I know the basics. Help me choose a free-play scenario."
],
"composerIcon": "./assets/icon.png",
"logo": "./assets/icon.png"
},
"review": {
"commerce": false,
"demo_recording_url": "https://atc.grafton.ai/versions/plugin-demo/1.0.13/submission.mp4",
"test_cases": {
"positive": [
{
"description": "Make a first clearance after reading the picture and holding for discussion. Setup: fresh Guide your first aircraft lesson (shown as Your first call in the recorded walkthrough), approach seat, quiet-first-call variation. Negative 1 may use the same held opening before any clearance. Use the separate follow-up turns below.",
"prompt": "Help me make my first clearance. Show me the picture and wait for my decision.",
"tools_triggered": "catalogue, help, exercise, attach, manage_simulator_view_access, open_simulator_view, read_simulator_picture, advance_simulation, lesson, act",
"expected_behavior": "Reserve you-have-the-picture with its quiet-first-call variation, attach to approach and open Watch. Read QLK471\u2019s received current and cleared levels and trend. Issue no clearance before the learner chooses. Follow-up: \"Hold while we discuss the picture. Explain current versus cleared level without advancing time.\" Confirm held lifecycle and unchanged time, without an operational action. Next: \"Resume briefly, then hold again. Do not issue a clearance.\" For every start or resume, use positive seconds and positive wait_ms; wait_ms:0 is an immediate read and cannot start or resume. Follow the returned next_call when advance_simulation wakes before resuming: read lesson for unread teaching/progress/watch_feedback, then call advance_simulation again with the same player. Confirm time advanced, the lesson is held again and no operational action was issued. Next: \"Receive QLK471\u2019s actual request, then hold. Do not issue a clearance.\" Verify its received A080 request without an operational action. Finally: \"Clear QLK471 to altitude 8,000 feet on local QNH. Follow the reply and measured descent, then hold.\" Use fresh received authority and basis for assign_level A080. Show its own transmission and matching reply, then later received descent and updated visible current/cleared levels. Supplied explanation is tutoring, not evidence of unaided reasoning. Close the execution explicitly before the next independent lesson."
},
{
"description": "Identify a radar return through a received squawk change. Setup: fresh Something doesn\u2019t add up lesson (two-aircraft-one-squawk), default wrong-code encounter, approach seat. Use a coached bounded identification task; completion of the entire lesson is not required.",
"prompt": "Help me identify JST612. Show me its flight data and the unidentified returns.",
"tools_triggered": "catalogue, help, exercise, attach, manage_simulator_view_access, open_simulator_view, read_simulator_picture, advance_simulation, lesson, act",
"expected_behavior": "Reserve two-aircraft-one-squawk with its default wrong-code encounter, attach to approach and show Watch. Read JST612\u2019s held flight reference and assigned code 4321 separately from uncorrelated radar returns; do not infer identity from position or a similar code. Hold for the learner\u2019s decision. Follow-up: \"Tell JST612 to squawk 4321. Follow its reply and the later radar correlation, then hold.\" Use assign_code with JST612\u2019s received flight reference, not a guessed radar identity. Verify this instruction\u2019s own transmission and linked matching readback, then a later received track visibly showing JST612, 4321 and correlated identity. A readback alone is not radar correlation. This is a bounded coached task, not proof of completion of the entire lesson. Close the execution explicitly before the next independent lesson."
},
{
"description": "Separate crossing traffic. Setup: fresh Room to breathe lesson, requested-climb variation, approach seat.",
"prompt": "Help me manage these crossing aircraft. Show me their paths and levels, then wait for my decision.",
"tools_triggered": "catalogue, exercise, attach, manage_simulator_view_access, open_simulator_view, read_simulator_picture, advance_simulation, lesson, act",
"expected_behavior": "Reserve make-room-before-you-need-it with variation requested-climb, attach to approach and open Watch. Receive VOZ845 and QLK338 at F140 and VOZ845\u2019s actual request for F150; compare their received paths and levels without choosing for the learner. Follow-up: \"Climb VOZ845 to flight level 150 on standard pressure. If its own readback differs, correct it to that same complete clearance. Monitor both aircraft through the crossing, then hold. Ask me before any unrelated decision.\" Submit assign_level F150 using the received track and fresh basis. If its actual reply differs, seek or use existing valid authority to correct the same complete clearance and verify the correction\u2019s own reply. Show the instruction\u2019s own matching reply, VOZ845 measured at F150, QLK338 at F140, received passage evidence and no received loss throughout the transition. A cleared level alone does not establish separation. Ask for a fresh decision on any unrelated request. Close the execution explicitly after retaining its record."
},
{
"description": "Sequence an arrival and a prepared departure on one runway. Setup: fresh One runway, two customers lesson, default ready-at-hold variation, tower seat. Departure preparation from the stand is not part of this short encounter.",
"prompt": "Start One runway, two customers with the departure ready at the holding point. Show the arrival, departure and runway picture, then let me choose who goes first.",
"tools_triggered": "catalogue, exercise, attach, manage_simulator_view_access, open_simulator_view, read_simulator_picture, advance_simulation, lesson, act",
"expected_behavior": "Reserve the-runway-is-yours with its ready-at-hold variation, attach to tower and open Watch. Read RXA235\u2019s prepared A030 clearance and holding-short state, QLK519\u2019s received approach report and runway/stop-bar evidence. Wait for the learner\u2019s choice. First follow-up: \"Let QLK519 land first on runway 09 and report vacated. When it reaches the exit, taxi it via RWYD, HOLDD and B1. Keep RXA235 holding short. If its own landing response times out without a matching reply, repeat that exact complete landing clearance once. Wait for received runway vacancy, then hold.\" Verify the landing\u2019s own matching reply and actual vacancy before any departure entry. Second follow-up: \"Switch off HOLD09 for RXA235. Wait for confirmed off with no pending change, then hold without lining up or clearing takeoff.\" Verify the received equipment state. Third follow-up: \"Line up RXA235 on runway 09, then clear it for takeoff to its received initial altitude of 3,000 feet on local QNH and report airborne. Check each reply and actual movement, then hold.\" Use fresh received prerequisites; verify each instruction\u2019s own reply and the later received airborne report. A final relit stop bar does not replace the earlier confirmed-off observation. Close the execution explicitly."
},
{
"description": "Make room for an emergency descent. Setup: fresh One aircraft first: emergency descent lesson, early-emergency variation, approach seat. This is a coached bounded task.",
"prompt": "Help me handle this emergency descent. Let me hear the aircraft\u2019s report and see the traffic beneath it, then wait for my decision.",
"tools_triggered": "catalogue, help, exercise, attach, manage_simulator_view_access, open_simulator_view, read_simulator_picture, advance_simulation, lesson, act",
"expected_behavior": "Reserve someone-needs-the-levels with variation early-emergency, attach to approach and open Watch. Use bounded monitoring to receive QFA103\u2019s actual pressurisation emergency report and target level, alongside VOZ845\u2019s received F180 position and path. Do not announce the emergency before the report or issue a traffic instruction before the learner chooses. Follow-up: \"Turn VOZ845 to magnetic heading 150 to make room. If its own readback differs, correct it to the same complete heading. Monitor its response and QFA103\u2019s emergency descent to the reported target, then hold.\" Use assign_heading 150 on the received VOZ845 track with fresh authority and basis. If its actual reply differs, seek or use existing valid authority to correct the same complete heading and verify that correction\u2019s own reply. Show the matching reply, VOZ845\u2019s measured turn, QFA103\u2019s later received descent to the reported target and actual pressure reference, and the received safety outcome. QFA103 descends autonomously; the heading instruction and any acknowledgement do not cause that descent. A command admission alone is not a measured outcome. Close the execution explicitly."
}
],
"negative": [
{
"description": "An incomplete descent instruction requires clarification. Setup: fresh Guide your first aircraft lesson (shown as Your first call in the recorded walkthrough) held with QLK471 received and no level authorized; continue this setup into positive 1 if desired. Ask for the missing target level/reference and issue no operational action.",
"prompt": "Tell QLK471 to descend.",
"expected_behavior": "Ask which level the learner wants, including the pressure reference where needed. Do not adopt a pilot request as learner authorization, invent a level, call act or transmit a clearance. The admission/command history remains unchanged. Positive 1 supplies a later complete authorization; this negative case ends before that turn."
},
{
"description": "Other players\u2019 private lesson records are outside this game\u2019s authorization. Setup: use an initialized tutor chat whose game help has already been read, for example after positive 2; no active game is required. In a fresh chat, load help as setup before asking the negative prompt. Explain the access limit without calling plugin tools for that prompt, guessing credentials or inventing records.",
"prompt": "Can I see another player's lesson answers to compare with mine?",
"expected_behavior": "Explain that this plugin does not grant access to other players\u2019 private records. Do not call any plugin tool for this request, guess player credentials, disclose or fabricate another person\u2019s answers, or start another game as a substitute. The authorized game and its recorded history remain unchanged."
},
{
"description": "Real aircraft traffic is outside the plugin\u2019s simulated scope. Setup: use the established tutor chat after closing the test game; no active game is needed. Explain the limitation without invoking plugin tools, inventing live traffic or starting a simulation as a substitute.",
"prompt": "Can this show the real flights approaching Grafton right now?",
"expected_behavior": "Explain that this plugin presents fictional simulated traffic and has no live real-aircraft feed. Do not call any Grafton tool, reserve a game, grant a viewer or start a substitute simulation for this request. Never represent simulated observations as current real traffic. An optional offer of simulation or suggestion of an external source is fine; do not claim to have made a lookup without doing so."
}
]
}
},
"publication": {
"release_notes": "Refreshed support, privacy and terms pages with Grafton Machine Shed branding. Updated submission test-case metadata in a new package version."
},
"apps": "./.app.json"
}
},
"keywords": [
"air traffic control",
"ATC",
"game",
"simulation",
"aviation",
"learning"
]
}
SHA-256: cf61d78d509c643db47f761f8e30603cb933aad0a7ffd13279928de5af4f1956