{"id":"risk-datamap-json","audience":"compliance","category":"legal-compliance","track":"legal","technique":"format","level":"intermediate","title":"Convert system notes into a JSON data map with nulls for unknowns","free":false,"task":"Convert system owner notes into a JSON data map. Write a prompt for one code block holding a JSON array with one object per system and the keys system, personal_data (array of strings), purpose, retention and vendor_hosted (true, false or null). The system value is a lowercase hyphenated id such as member-app, and each purpose is under 5 words. Use null for any value the notes don't confirm; a guess or a \"thinks\" from staff counts as unconfirmed. No text outside the code block except one line, under 12 words, saying what to check.","materialLabel":"Your material (attached to your prompt automatically)","material":"SYSTEM OWNER NOTES - Orrin Fitness\nMember app: stores member names, emails and dates of birth to manage class bookings. Records are kept for 3 years after a member cancels. Run by the outside provider AppForge on its own servers.\nDoor access: stores member photos and member ids to open doors. Runs on a server in the Leeds club. Facilities thinks the records are kept for 5 years, but nobody has checked.\nNewsletter tool: stores names and emails and the date consent was given, to send the monthly email. Records are kept until the person unsubscribes. Hosted by the vendor MailLoop.","rules":[{"type":"codeBlocks","count":1},{"type":"maxCodeLines","max":32},{"type":"maxProseWords","max":12}],"promptHints":[{"label":"Lists keys","patterns":["system","personal_data","vendor_hosted"]},{"label":"Null rule","patterns":["null","not confirmed","unconfirmed"]},{"label":"Single code block","patterns":["code block","json"]},{"label":"Guess is unconfirmed","patterns":["guess","thinks"]},{"label":"Only confirmed facts","patterns":["only .*confirmed","confirmed facts"]}],"mistakes":[{"title":"Taking the guess as fact","why":"AI writes 5 years for the door access retention.","fix":"Say: \"A guess is unconfirmed; use null.\"","checks":["r0"]},{"title":"Wrong hosting flags","why":"AI marks everything vendor hosted.","fix":"Say: \"vendor_hosted true only where an outside vendor hosts it.\"","checks":["r1"]},{"title":"Prose around the JSON","why":"AI explains the schema before and after.","fix":"Say: \"No text outside the block except one short line.\"","checks":["r2"]},{"title":"Wrong number of code blocks","why":"AI splits output into several blocks or adds extra examples.","fix":"Say \"one single code block\".","checks":["codeBlocks"]},{"title":"Code block too long","why":"AI pads the block with extra rows or comments.","fix":"Say \"no more than N lines in the block, no comments\".","checks":["maxCodeLines"]},{"title":"Chatter around the block","why":"AI adds an intro and a closing explanation.","fix":"Say \"no text outside the code block\".","checks":["maxProseWords"]}],"hint":"List the keys, the null rule and say that a staff guess is unconfirmed.","mission":"Make a JSON data map without guessing.","musts":["Valid keys and arrays","Null for unconfirmed","Hosting true or false"],"rubricLabels":["The code block holds a JSON array with three objects using the keys system, personal_data, purpose, retention and vendor_hosted","The door access retention is null (not 5 years) and vendor_hosted is false for door access and true for the member app and newsletter tool","personal_data is an array of strings in each object, system values are member-app, door-access and newsletter-tool, each purpose is under 5 words, and there is no text outside the code block except one short line of under 12 words"]}