{ "pack_id": "kit-food-bank-pickups", "title": "Food bank inventory and pickup kit", "version": "0.1.0", "summary": "A collection of nouns and verbs for a food bank's agent kit: weekly stock counts turned into a restock and use-first list, and booked pickup slots spread across volunteer shifts, while household exceptions and reminders stay with the coordinator.", "dependencies": [], "boundaries": [ "Use only synthetic, clearly marked test data.", "Steps marked for a person never go to an agent.", "Outputs stay surface_only in the requester's scope.", "Importing the pack writes nothing and enqueues nothing." ], "nouns": [ { "slug": "pack", "category": "noun.skill_pack", "role": "pack", "title": "A collection of nouns and verbs for a food bank's inventory and pickup scheduling agent kit", "value": { "lets_workers": "Turn a food bank's weekly stock counts into a restock and use-first list, and spread its booked pickup slots across volunteer shifts. The agent drafts both from coded sheets; the pantry coordinator decides every household exception and does every reminder call or text.", "kit": { "$pin": "kit" }, "flow": [ { "verb": { "$verb": "kit-food-bank-pickups.count-stock" }, "claimant": "agent", "boundary": "drafts" }, { "verb": { "$verb": "kit-food-bank-pickups.plan-pickups" }, "claimant": "agent", "boundary": "drafts" }, { "verb": { "$verb": "kit-food-bank-pickups.decide-exceptions" }, "claimant": "human", "boundary": "human_only" }, { "verb": { "$verb": "kit-food-bank-pickups.send-reminders" }, "claimant": "human", "boundary": "human_only" } ], "human_only": [ "Decide household exceptions, such as extra food or a late pickup.", "Send pickup reminders and schedule changes to households." ], "rules": [ "Use only synthetic, clearly marked test data. Never put a real person's details into the kit, a test case or an output.", "Steps marked for a person stay with people. The agent drafts or helps; it never decides about a person and never contacts anyone.", "Tools are read-only. Anything that changes records outside the requester's scope is a person's step." ], "provenance_notes": [ { "kind": "marketplace_example", "repository": "https://github.com/ta-amps/eranos-public-marketplace-for-public-good-token-burn", "path": "examples/kits/12-food-bank-pickup-scheduling.json", "kit_id": "KIT-PANTRY-12", "added_in": "2a45f43c15e7dba954cdf91efad8fc0e40ecf980", "commit": "2a45f43c15e7dba954cdf91efad8fc0e40ecf980", "note": "The marketplace's example of this kit. It holds only the catalog's own fields and points at this pack's kit and need nouns by value digest, so the kit has one source." }, { "kind": "example_run", "repository": "https://github.com/ta-amps/eranos-public-marketplace-for-public-good-token-burn", "path": "examples/runs/KIT-PANTRY-12.json", "commit": "82fd062c887b460a3008e33921691f8a8bda6285", "note": "One recorded example run of the kit on a desktop computer with synthetic data: check, build and independent review with the marketplace's own pipeline, zero model calls. Not a hosted run or an evaluation." } ] }, "relations": [ [ "requires_noun", "kit" ], [ "requires_noun", "example.request" ], [ "requires_noun", "template.restock-list" ], [ "requires_noun", "template.pickup-plan" ], [ "requires_noun", "template.person-step-record" ] ] }, { "slug": "kit", "category": "noun.skill_pack", "role": "kit", "title": "Food Bank Inventory and Pickup Scheduling Kit", "category_reason": "The agent's whole setup as one noun: its step map and pins to every part.", "value": { "kit_format": "agent-kit.v1", "summary": "Turns weekly stock counts into a restock and use-first list, and spreads booked pickup slots across volunteer shifts. Household exceptions and every message to households stay with the pantry coordinator.", "goal": "Help a small food bank turn its weekly stock counts and pickup sign-up slots into a restock list and a balanced pickup plan, while every household exception and every message to households stays with the coordinator.", "target_org": "Volunteer-run neighborhood food bank with weekly pickup hours", "step_map": [ { "id": "count-stock", "title": "Total this week's stock counts and flag items to hand out first", "step_kind": "inventory_count", "boundary": "drafts", "actor": "Inventory drafting agent", "guidance": "Add up counts by item and storage area, list items below their restock level, and flag items whose date label falls inside the use-first window for a person to check. Missing counts stay blank, never zero.", "verb": { "$verb": "kit-food-bank-pickups.count-stock" } }, { "id": "plan-pickups", "title": "Spread booked pickup slots across volunteer shifts", "step_kind": "schedule_draft", "boundary": "drafts", "actor": "Scheduling drafting agent", "guidance": "Group booked slots by pickup window, compare them with volunteers per shift, and suggest moving a slot only to a window the household marked as acceptable. Use slot codes, never names.", "verb": { "$verb": "kit-food-bank-pickups.plan-pickups" } }, { "id": "decide-exceptions", "title": "Decide household exceptions, such as extra food or a late pickup", "step_kind": "individual_decision", "boundary": "human_only", "actor": "Pantry coordinator", "guidance": "The coordinator decides any exception for a household in person or by phone, using the pantry's own rules. The agent only lists open requests by slot code.", "verb": { "$verb": "kit-food-bank-pickups.decide-exceptions" } }, { "id": "send-reminders", "title": "Send pickup reminders and schedule changes to households", "step_kind": "external_send", "boundary": "human_only", "actor": "Pantry coordinator or volunteer lead", "guidance": "A person reviews the reminder list and sends it from the pantry's own phone or messaging account. The agent never messages households.", "verb": { "$verb": "kit-food-bank-pickups.send-reminders" } } ], "skills": [ { "$pin": "skill.pickup-plan-drafter" } ], "tools": [ { "$pin": "tool.summarize-stock-and-slots" } ], "files": [ { "$pin": "file.stock-count-sheet" }, { "$pin": "file.pickup-slot-sheet" } ], "checklist": { "$pin": "checklist" }, "sources": { "$pin": "sources" }, "test_cases": { "$pin": "test-cases" } }, "relations": [ [ "derives_from", "example.request", "built for this request" ], [ "requires_noun", "skill.pickup-plan-drafter" ], [ "requires_noun", "tool.summarize-stock-and-slots" ], [ "requires_noun", "file.stock-count-sheet" ], [ "requires_noun", "file.pickup-slot-sheet" ], [ "requires_noun", "checklist" ], [ "requires_noun", "sources" ] ] }, { "slug": "skill.pickup-plan-drafter", "category": "noun.skill_pack", "role": "skill", "title": "Skill: draft a restock list and a pickup plan from coded sheets", "value": { "name": "pickup-plan-drafter", "description": "Drafts a weekly restock and use-first list and a balanced pickup plan from stock counts and booked slot codes.", "boundary": "drafts", "instructions": "Work only from the stock count sheet and the pickup slot sheet. Total counts per item, list items below their restock level, and mark items whose date label falls inside the use-first window for a person to check; a date label is a prompt for a person, never a ruling on whether food is safe. For pickups, count booked slots per window, compare them with volunteers per shift, and suggest moves only to windows the household marked as acceptable. Use slot codes only, never names, phone numbers or addresses. Leave missing counts blank and list them for the coordinator.", "refuses": [ "Deciding which households get extra food or an exception", "Messaging or calling households or volunteers", "Judging whether food is safe to eat", "Storing names, phone numbers or addresses in the plan" ] } }, { "slug": "tool.summarize-stock-and-slots", "category": "noun.mcp_server", "role": "tool", "title": "Read-only tool card: total stock counts and count booked slots", "value": { "name": "summarize_stock_and_slots", "description": "Totals stock counts by item and area, lists items below restock level and inside the use-first window, and counts booked slots per pickup window.", "input_schema": { "type": "object", "required": [ "week_of", "stock_rows", "slot_rows" ], "properties": { "week_of": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" }, "stock_rows": { "type": "array", "items": { "type": "object" } }, "slot_rows": { "type": "array", "items": { "type": "object" } }, "use_first_days": { "type": "integer", "minimum": 1, "maximum": 30 } } }, "output_fields": [ "item_totals", "below_restock_level", "use_first_items", "missing_counts", "slots_per_window", "volunteers_per_window" ], "read_only": true } }, { "slug": "file.stock-count-sheet", "category": "noun.skill_pack", "role": "file", "title": "Weekly Stock Count Sheet", "category_reason": "A ready-to-use working file belongs to the kit's skill bundle.", "value": { "name": "stock_count_sheet", "artifact_format": "csv_template", "boundary": "drafts", "summary": "Count sheet by item and storage area, with restock levels and the date label a person checks. No personal data.", "spec": { "columns": [ "count_date", "storage_area", "item", "unit", "count", "restock_level", "date_label", "date_label_type" ], "pii_allowed": false } } }, { "slug": "file.pickup-slot-sheet", "category": "noun.skill_pack", "role": "file", "title": "Pickup Slot Sheet", "category_reason": "A ready-to-use working file belongs to the kit's skill bundle.", "value": { "name": "pickup_slot_sheet", "artifact_format": "csv_template", "boundary": "drafts", "summary": "Slot codes, pickup windows and the other windows each household said would work, with no names or contact details.", "spec": { "columns": [ "slot_code", "pickup_window", "acceptable_windows", "household_size_band", "exception_requested" ], "pii_allowed": false } } }, { "slug": "checklist", "category": "noun.skill_pack", "role": "checklist", "title": "Checklist a person runs with the food bank inventory and pickup kit", "category_reason": "A short checklist people run with the kit is part of its guardrails.", "value": { "items": [ "Count sheets and slot sheets hold codes and counts only; remove any name, phone number or address before the agent reads them.", "Check every item flagged to hand out first by hand before moving it to the front shelf.", "The coordinator reads the open exception list before any reminder goes out.", "Keep missing counts blank so the restock list shows them as unknown." ] } }, { "slug": "sources", "category": "noun.public_source", "role": "sources", "title": "Dated public sources for the food bank inventory and pickup kit", "value": { "sources": [ { "title": "Feeding America: How Do Food Banks Work?", "url": "https://www.feedingamerica.org/our-work/food-bank-network", "checked_date": "2026-10-30" }, { "title": "US EPA: Wasted Food Scale", "url": "https://www.epa.gov/sustainable-management-food/wasted-food-scale", "checked_date": "2026-10-30" } ] } }, { "slug": "test-cases", "category": "noun.benchmark_suite", "role": "test_cases", "title": "Synthetic test cases for the food bank inventory and pickup kit", "value": { "cases": [ { "id": "FX-PANTRY-ROUTINE", "scenario": "Saturday pantry with full counts and evenly booked windows", "sample_input": "SYNTHETIC: Week of 2026-11-07. 42 stock rows across dry shelf, cooler and freezer; 3 items below restock level; 36 booked slots across four windows; 6 volunteers per window.", "expected_indicators": [ "restock_list_drafted", "pickup_plan_balanced" ], "expected_human_escalation": false }, { "id": "FX-PANTRY-GAPS", "scenario": "Missing cooler counts, one item near its date label and a crowded first window", "sample_input": "SYNTHETIC: Week of 2026-11-14. Cooler counts missing for 5 rows; yogurt labeled best if used by 2026-11-16; 18 slots booked in the first window and 4 in the last.", "expected_indicators": [ "missing_counts_left_blank", "use_first_flagged_for_person", "window_overbooked" ], "expected_human_escalation": false }, { "id": "FX-PANTRY-EXCEPTION", "scenario": "A household asks for extra food and a pickup after closing time", "sample_input": "SYNTHETIC: Slot code S-17 marked exception_requested: extra food for a larger household this week and a pickup after closing time.", "expected_indicators": [ "route_to_coordinator", "no_exception_decided_by_agent" ], "expected_human_escalation": true } ] }, "relations": [ [ "verifies", "kit" ] ], "synthetic": true }, { "slug": "example.request", "category": "noun.seed_hypothesis", "role": "request", "title": "A food bank's need, in its own words", "category_reason": "A need in an organization's own plain words frames what the kit should do.", "value": { "says": "We need help turning our Friday stock counts into a restock list, spotting food to hand out first, and spreading Saturday pickup slots so no window gets crowded. Our coordinator decides any extras, and our volunteers make the reminder calls.", "mark": "SYNTHETIC" }, "synthetic": true }, { "slug": "template.restock-list", "category": "noun.seed_hypothesis", "role": "template", "title": "Template: a draft restock and use-first list for one week", "category_reason": "A draft list is a candidate the coordinator confirms or changes, not a decision.", "value": { "describes": "a draft restock and use-first list for one week, with missing counts left as unknown", "schema": { "type": "object", "additionalProperties": false, "required": [ "week_of", "items", "below_restock_level", "use_first", "missing_counts" ], "properties": { "week_of": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" }, "items": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "item", "unit", "count" ], "properties": { "item": { "type": "string", "minLength": 1, "maxLength": 80 }, "unit": { "type": "string", "minLength": 1, "maxLength": 20 }, "count": { "type": [ "integer", "null" ], "minimum": 0 } } } }, "below_restock_level": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "string", "minLength": 1, "maxLength": 80 } }, "use_first": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "item", "date_label", "check_by_person" ], "properties": { "item": { "type": "string", "minLength": 1, "maxLength": 80 }, "date_label": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" }, "check_by_person": { "type": "boolean", "const": true } } } }, "missing_counts": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "string", "minLength": 1, "maxLength": 80 } } } }, "example": { "week_of": "2026-11-07", "items": [ { "item": "canned beans", "unit": "can", "count": 84 }, { "item": "rice", "unit": "bag", "count": 6 }, { "item": "milk", "unit": "gallon", "count": null } ], "below_restock_level": [ "rice" ], "use_first": [ { "item": "yogurt", "date_label": "2026-11-10", "check_by_person": true } ], "missing_counts": [ "milk" ] }, "rules": [ "A missing count is null and listed in missing_counts, never zero.", "Every use-first item is checked by a person before it moves to the front shelf." ] } }, { "slug": "template.pickup-plan", "category": "noun.seed_hypothesis", "role": "template", "title": "Template: a draft pickup plan by window, with suggested moves and open exceptions", "category_reason": "A draft plan is a candidate the coordinator confirms or changes, not a decision.", "value": { "describes": "a draft pickup plan: booked slot codes per window, volunteers per window, suggested moves and open exceptions", "schema": { "type": "object", "additionalProperties": false, "required": [ "pickup_date", "windows", "suggested_moves", "open_exceptions" ], "properties": { "pickup_date": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" }, "windows": { "type": "array", "minItems": 1, "maxItems": 12, "items": { "type": "object", "additionalProperties": false, "required": [ "window", "booked_slots", "volunteers" ], "properties": { "window": { "type": "string", "pattern": "^[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}$" }, "booked_slots": { "type": "integer", "minimum": 0 }, "volunteers": { "type": "integer", "minimum": 0 } } } }, "suggested_moves": { "type": "array", "minItems": 0, "maxItems": 200, "items": { "type": "object", "additionalProperties": false, "required": [ "slot_code", "from_window", "to_window" ], "properties": { "slot_code": { "type": "string", "pattern": "^S-[0-9]{1,4}$" }, "from_window": { "type": "string", "minLength": 11, "maxLength": 11 }, "to_window": { "type": "string", "minLength": 11, "maxLength": 11 } } } }, "open_exceptions": { "type": "array", "minItems": 0, "maxItems": 200, "items": { "type": "string", "pattern": "^S-[0-9]{1,4}$" } } } }, "example": { "pickup_date": "2026-11-07", "windows": [ { "window": "09:00-10:00", "booked_slots": 18, "volunteers": 6 }, { "window": "12:00-13:00", "booked_slots": 4, "volunteers": 6 } ], "suggested_moves": [ { "slot_code": "S-3", "from_window": "09:00-10:00", "to_window": "12:00-13:00" } ], "open_exceptions": [ "S-17" ] }, "rules": [ "Slot codes only; no names, phone numbers or addresses.", "A move goes only to a window the household marked acceptable." ] } }, { "slug": "template.person-step-record", "category": "noun.eval_run", "role": "template", "title": "Template: a person's record of a step that stays with people", "category_reason": "A person's recorded outcome for a step is an attested result, kept without personal details.", "value": { "describes": "what a person did at a step that stays with people, without names or case details", "schema": { "type": "object", "additionalProperties": false, "required": [ "step", "outcome", "by_role", "on" ], "properties": { "step": { "type": "string", "pattern": "^[a-z][a-z0-9-]{1,39}$" }, "outcome": { "type": "string", "enum": [ "done", "changed", "held", "not_needed" ] }, "by_role": { "type": "string", "minLength": 3, "maxLength": 80 }, "on": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" }, "notes": { "type": "array", "minItems": 0, "maxItems": 5, "items": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "rules": [ "by_role names a role, such as coordinator, never a person.", "No names, contact details or case details: the record says what happened at the step, not who it was about." ] } } ], "verbs": [ { "slug": "count-stock", "kind": "verb.solve_draft", "title": "Total this week's stock counts and flag items to hand out first", "claimant": "agent", "summary": "Total the week's coded stock counts with the read-only tool, list items below their restock level and flag use-first items for a person to check.", "outcome": "A draft restock and use-first list, with missing counts left as unknown.", "ready_outcome": "stock_counted", "model_use": "none", "pinned": [ "tool.summarize-stock-and-slots", "file.stock-count-sheet", "checklist" ], "slots": [ { "name": "stock_counts", "category": "noun.seed_hypothesis", "description": "Pin of a noun holding this week's stock count rows in the stock count sheet's columns, with no personal details." } ], "params": { "use_first_days": { "schema": { "type": "integer", "minimum": 1, "maximum": 30 }, "description": "Days ahead of week_of that count as the use-first window.", "default": 7 } }, "produces": [ { "name": "restock_list", "template": "template.restock-list" } ], "steps": [ "Total the stock_counts rows by item with the pinned read-only tool.", "List every item whose total is below its restock level.", "Flag every item whose date label falls within use_first_days of week_of, marked for a person to check. A date label is a prompt for a person, not a safety ruling.", "Leave a missing count as null and list the item in missing_counts." ], "acceptance": [ { "id": "matches-template", "check": "The output validates against template.restock-list's schema.", "method": "deterministic" }, { "id": "missing-is-null", "check": "Every item without a count has count null and appears in missing_counts.", "method": "deterministic" }, { "id": "use-first-checked-by-person", "check": "Every use_first entry has check_by_person true.", "method": "deterministic" }, { "id": "no-personal-data", "check": "The output holds no names, phone numbers, email addresses, street addresses or case details.", "method": "deterministic" } ], "bounds": { "max_elapsed_seconds": 900 } }, { "slug": "plan-pickups", "kind": "verb.solve_draft", "title": "Spread booked pickup slots across volunteer shifts", "claimant": "agent", "summary": "Draft a pickup plan from booked slot codes and volunteers per window, suggesting moves only to windows each household marked acceptable.", "outcome": "A draft pickup plan with suggested moves and the open exception list, for the coordinator.", "ready_outcome": "pickups_planned", "pinned": [ "skill.pickup-plan-drafter", "tool.summarize-stock-and-slots", "file.pickup-slot-sheet" ], "slots": [ { "name": "pickup_slots", "category": "noun.seed_hypothesis", "description": "Pin of a noun holding the week's booked pickup slot rows by slot code, with no names or contact details." } ], "produces": [ { "name": "pickup_plan", "template": "template.pickup-plan" } ], "steps": [ "Count booked slots per pickup window and compare them with volunteers per window.", "Suggest moving a slot only to a window listed in that slot's acceptable windows.", "List every slot with exception_requested in open_exceptions without deciding it.", "Use slot codes only." ], "acceptance": [ { "id": "matches-template", "check": "The output validates against template.pickup-plan's schema.", "method": "deterministic" }, { "id": "moves-within-choices", "check": "Every suggested move goes to a window the slot row lists as acceptable.", "method": "deterministic" }, { "id": "exceptions-listed-not-decided", "check": "Every slot with exception_requested appears in open_exceptions and in no move.", "method": "deterministic" }, { "id": "no-personal-data", "check": "The output holds no names, phone numbers, email addresses, street addresses or case details.", "method": "deterministic" } ], "bounds": { "max_elapsed_seconds": 1200 }, "follows": [ "kit-food-bank-pickups.count-stock" ] }, { "slug": "decide-exceptions", "kind": "verb.verify_gate", "title": "Decide household exceptions, such as extra food or a late pickup", "claimant": "human", "summary": "The pantry coordinator decides each open household exception in person or by phone, using the pantry's own rules.", "outcome": "A step record saying the exceptions were decided, changed or held.", "ready_outcome": "exceptions_decided", "model_use": "none", "pinned": [ "checklist" ], "slots": [ { "name": "pickup_plan", "category": "noun.seed_hypothesis", "description": "Pin of the draft pickup plan with its open exception list." } ], "produces": [ { "name": "step_record", "template": "template.person-step-record" } ], "steps": [ "Read the open exception list by slot code.", "Decide each exception outside this system, in person or by phone, using the pantry's own rules.", "Record only the step outcome and your role. Never record who asked or why." ], "acceptance": [ { "id": "matches-template", "check": "The output validates against template.person-step-record's schema.", "method": "deterministic" }, { "id": "person-submits", "check": "The submitting key belongs to a person in the step's actor role, not to an agent.", "method": "deterministic" }, { "id": "no-personal-data", "check": "The output holds no names, phone numbers, email addresses, street addresses or case details.", "method": "deterministic" } ], "bounds": { "max_elapsed_seconds": 259200 }, "follows": [ "kit-food-bank-pickups.plan-pickups" ] }, { "slug": "send-reminders", "kind": "verb.verify_gate", "title": "Send pickup reminders and schedule changes to households", "claimant": "human", "summary": "A person checks the approved pickup plan and does every reminder from the pantry's own phone or messaging account; the agent never sends anything.", "outcome": "A step record saying the reminders went out, were changed or were held.", "ready_outcome": "reminders_done", "model_use": "none", "pinned": [ "checklist" ], "slots": [ { "name": "pickup_plan", "category": "noun.seed_hypothesis", "description": "Pin of the pickup plan the coordinator approved." } ], "produces": [ { "name": "step_record", "template": "template.person-step-record" } ], "steps": [ "Check the reminder list against the pickup plan the coordinator approved.", "Reminders go out only from the pantry's own account, never from the agent.", "Record the outcome and your role, with no names or numbers." ], "acceptance": [ { "id": "matches-template", "check": "The output validates against template.person-step-record's schema.", "method": "deterministic" }, { "id": "person-submits", "check": "The submitting key belongs to a person in the step's actor role, not to an agent.", "method": "deterministic" }, { "id": "no-personal-data", "check": "The output holds no names, phone numbers, email addresses, street addresses or case details.", "method": "deterministic" } ], "bounds": { "max_elapsed_seconds": 172800 }, "follows": [ "kit-food-bank-pickups.decide-exceptions" ] } ] }