← ShotPulledCONTENT HISTORY

Update to ShotPulled

Snapshot Oct 24, 2026 · 13:07 UTC · version 1.3.0

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save ShotPulled and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 23:01 UTC

c95b9a7dc75a6efa073018492405cdbd63b88da9e284ded44bc95657853b55be

After

Oct 24, 2026 · 13:07 UTC

0d433953629e7ff138053fd6f37b482fd549b97977b3b10de5077023e0078748

Package file

Before

Sep 30, 2026 · 23:01 UTC

127

After

Oct 24, 2026 · 13:07 UTC

102

Package file

Before

Sep 30, 2026 · 23:01 UTC

{"sha256":"25b9505b59a3213018eb29c3ef05f462b572138e56ec47b2d4c6ed0a2515a260","size":3218}

After

Oct 24, 2026 · 13:07 UTC

Not present

Package file

Before

Sep 30, 2026 · 23:01 UTC

Not present

After

Oct 24, 2026 · 13:07 UTC

{"sha256":"a5922e215c104d69f3f41e7b0001adc06d27d87d816ae4019bae5ece79d71905","size":24398}

Compare saved observations

Download comparison JSON

Changed files

Choose a file to see its text changes. Binary or large files show metadata only.

.app.json →

.codex-plugin/plugin.json →

assets/icon-large.png →

assets/icon-small.svg →

mcp.json →

plugin.json →

skills/shotpulled-dialing/SKILL.md →

skills/shotpulled-dialing/references/knowledge-base.md →

plugin.json

− removed · + added

--- before
+++ after
@@ -0,0 +1,83 @@
+{
+  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
+  "name": "app-6a7c58989aa081919f4658ff5986e174",
+  "version": "1.3.0",
+  "description": "Espresso dialing: log a shot, say how it tasted, get one change in your grinder's own clicks.",
+  "author": {
+    "name": "ShotPulled",
+    "url": "https://shotpulled.com"
+  },
+  "homepage": "https://shotpulled.com",
+  "extensions": {
+    "com.openai": {
+      "interface": {
+        "displayName": "ShotPulled",
+        "shortDescription": "Track and dial in espresso",
+        "longDescription": "ShotPulled is a brewing log and dial-in assistant for home espresso. You record each shot you pull, and it suggests one change to try on the next one.\n\nRegister your coffee, grinder, espresso machine, and scale. After each shot, log the dose, yield, brew time, and how it tasted. ShotPulled reads the shot together with the coffee\u2019s age and your grinder setting, then gives the likely causes in ranked order and one adjustment to try next, with the reasoning behind it.\n\nIt tracks your coffee. Each logged dose is deducted from the bag, so you can see the grams remaining, an estimate of the shots left at the dose you use, and where the bag is in its rest and peak window. Coffees and bags are separate records: register a coffee once, then each bag you buy of it, and your recipes and notes stay with the coffee.\n\nIt tracks equipment maintenance. ShotPulled holds maintenance information researched for 190 grinder and espresso machine models, drawn from the manufacturers\u2019 manuals where available, for tasks such as descaling, backflushing, burr cleaning and water filters. Ask what is due, log a task when you do it, set your own intervals, and read step-by-step guides where one exists for your model. A task the maker advises against is not listed as due.\n\nWhen a recipe works, lock it and look it up later. ShotPulled handles grinder settings given as clicks, numbered collars, compound ring positions such as 1.2.2, and named settings, and includes specifications for 66 grinders, 124 espresso machines, and 17 scales.\n\nWhat you record here is saved to your ShotPulled account, which the ShotPulled web dashboard and iPhone app also use.",
+        "developerName": "ShotPulled",
+        "category": "Productivity",
+        "capabilities": [],
+        "websiteURL": "https://shotpulled.com",
+        "supportURL": "https://shotpulled.com/support",
+        "privacyPolicyURL": "https://shotpulled.com/privacy",
+        "termsOfServiceURL": "https://shotpulled.com/terms",
+        "composerIcon": "./assets/icon-small.svg",
+        "logo": "./assets/icon-large.png"
+      },
+      "review": {
+        "test_cases": {
+          "positive": [
+            {
+              "description": "Log a sour shot and get one change",
+              "prompt": "I just pulled a shot on my current setup: 18 g in, 28 g out in 19 seconds, stopped it myself. It tasted sour and thin. Log it and tell me the one thing to change.",
+              "tools_triggered": "log_shot, diagnose_shot",
+              "expected_behavior": "The shot is logged with sour and thin as sensory tags, and diagnose_shot reads it as under-extracted. The reply recommends exactly one change (the top-ranked lever, such as a longer yield) with its reason. From the 4th shot in a day it may also suggest resting the palate."
+            },
+            {
+              "description": "Add a newly bought bag of coffee",
+              "prompt": "I just bought a 250 g bag of Colombia La Esperanza from Square Mile: washed, medium roast, roasted on 22 September 2026. Add it to my coffees.",
+              "tools_triggered": "list_beans, register_coffee or register_bag",
+              "expected_behavior": "list_beans is checked first. If the coffee is not on file, register_coffee adds it; if an earlier run already added it, register_bag adds a bag to it rather than a duplicate. The reply confirms 250 g roasted 22 Sep 2026 and that the coffee in use did not change."
+            },
+            {
+              "description": "Check what is left in the current bag and how fresh it is",
+              "prompt": "How much coffee is left in my current bag, roughly how many shots is that, and is it still in its peak window?",
+              "tools_triggered": "get_dial_state",
+              "expected_behavior": "Reads the active coffee's current bag. The reply gives the grams remaining, the estimated shots left at the user's usual dose, the days off roast, and whether the bag is still resting, at its peak or past it against its rest window."
+            },
+            {
+              "description": "See what maintenance is due",
+              "prompt": "Is any cleaning or maintenance due on my grinder or espresso machine?",
+              "tools_triggered": "list_maintenance_due",
+              "expected_behavior": "Calls list_maintenance_due and lists each task that is due or overdue on the user's current grinder and machine, most urgent first, with how far along it is and whether the interval is the maker's, the user's or ShotPulled's default. If nothing is due, it says so."
+            },
+            {
+              "description": "Get step-by-step descaling instructions for the user\u2019s machine",
+              "prompt": "Walk me through descaling my espresso machine, using the steps for my model.",
+              "tools_triggered": "get_maintenance_guides",
+              "expected_behavior": "Calls get_maintenance_guides for the user's machine and walks through its descale guide (supplies, steps and warnings), citing the maker's document. It adds no steps the guide lacks and suggests no task the maker advises against."
+            }
+          ],
+          "negative": [
+            {
+              "description": "General coffee trivia with no user data involved. The prompt says \"espresso\", but there is nothing to look up in the account and no shot to diagnose, so no connector is needed to answer it. The plugin should not be invoked; the request is outside its supported workflows.",
+              "prompt": "How much caffeine is in a double espresso compared to a drip coffee?"
+            },
+            {
+              "description": "Local search. The prompt mentions coffee, but ShotPulled holds only the user\u2019s own brewing records and equipment; it has no places, maps or caf\u00e9 data. The plugin should not be invoked; the request is outside its supported workflows.",
+              "prompt": "Find a caf\u00e9 near me that serves a good flat white."
+            },
+            {
+              "description": "Shopping advice. The prompt names a grinder, but ShotPulled records equipment a person already owns in order to compute its settings; it does not compare or recommend products to buy. The plugin should not be invoked; the request is outside its supported workflows.",
+              "prompt": "What's the best espresso grinder I can buy for under $500?"
+            }
+          ]
+        }
+      },
+      "publication": {
+        "release_notes": "Clearer tool descriptions, and codes beside the words.\n\n- Every tool and parameter description is reworded without em dashes. No constraint, default or example changed.\n- register_coffee and register_bag declare catalog_coffee_id, product_id and lot_revision_id: references the ShotPulled apps set when a coffee comes from the catalog. They are optional, and ChatGPT does not need to send them.\n- Freshness verdicts carry a stable code beside the words: age_verdict_code on list_beans and get_dial_state, verdict_code on compute_age.\n- diagnose_shot, diagnose_preview and suggest_next_step add warning_codes beside their warnings (session_fatigue, oscillation).\n- list_beans gives each origin's country as an ISO 3166-1 alpha-2 code (country_code) beside the name, which stays as written.\n- A coffee registered without a roaster is now valid in the published output: roaster (list_beans, get_dial_state) and roaster_name (list_recipes) may be null. The server already sent null for one.\n\nNo tool was renamed or removed, and no parameter became required. Every existing call keeps working unchanged."
+      },
+      "apps": "./.app.json"
+    }
+  }
+}
Full technical diff · 11 changed fields

changed /files/.app.json/sha256

BEFORE
"c95b9a7dc75a6efa073018492405cdbd63b88da9e284ded44bc95657853b55be"
AFTER
"0d433953629e7ff138053fd6f37b482fd549b97977b3b10de5077023e0078748"

changed /files/.app.json/size

BEFORE
127
AFTER
102

removed /files/.codex-plugin~1plugin.json

BEFORE
{
  "sha256": "25b9505b59a3213018eb29c3ef05f462b572138e56ec47b2d4c6ed0a2515a260",
  "size": 3218
}
AFTER
Field is absent

added /files/assets~1icon-large.png

BEFORE
Field was absent
AFTER
{
  "sha256": "a5922e215c104d69f3f41e7b0001adc06d27d87d816ae4019bae5ece79d71905",
  "size": 24398
}

added /files/assets~1icon-small.svg

BEFORE
Field was absent
AFTER
{
  "sha256": "2ff52d186439ab99e8bf7dac620f9a444bcb6988ca93faf6f930002e55ff12bc",
  "size": 3911
}

added /files/mcp.json

BEFORE
Field was absent
AFTER
{
  "sha256": "ef3b452702a7a70f251b3454a10f856e4d9c887f2c2081ef7503dc937a3e1cfa",
  "size": 203
}

added /files/plugin.json

BEFORE
Field was absent
AFTER
{
  "sha256": "2295d7807a5ec7be40fbf0f3d343b8cacbe90294ad4af7404aaaa608673db90d",
  "size": 8215
}

changed /files/skills~1shotpulled-dialing~1SKILL.md/sha256

BEFORE
"dfb1cfcf93ae9e58be7ad4b1507c8eb1816057aa9d32b5bcbb14e180e45b500d"
AFTER
"f295ddff1e12e74d00401d7f1483bd71884ec9643db1c2fb4a55782ce9c86865"

changed /files/skills~1shotpulled-dialing~1SKILL.md/size

BEFORE
4563
AFTER
5492

changed /files/skills~1shotpulled-dialing~1references~1knowledge-base.md/sha256

BEFORE
"8a1781fa1bfe79b7eacdbad696a09ff9a5e88b7b2bc97722735d575e20107583"
AFTER
"0e20b0d2c6aa39da6d98e6dde4a2bd108cd8e981af984c8478b1da6148f21995"

changed /files/skills~1shotpulled-dialing~1references~1knowledge-base.md/size

BEFORE
6982
AFTER
9558
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "0d433953629e7ff138053fd6f37b482fd549b97977b3b10de5077023e0078748",
      "size": 102
    },
    "assets/icon-large.png": {
      "sha256": "a5922e215c104d69f3f41e7b0001adc06d27d87d816ae4019bae5ece79d71905",
      "size": 24398
    },
    "assets/icon-small.svg": {
      "sha256": "2ff52d186439ab99e8bf7dac620f9a444bcb6988ca93faf6f930002e55ff12bc",
      "size": 3911
    },
    "mcp.json": {
      "sha256": "ef3b452702a7a70f251b3454a10f856e4d9c887f2c2081ef7503dc937a3e1cfa",
      "size": 203
    },
    "plugin.json": {
      "sha256": "2295d7807a5ec7be40fbf0f3d343b8cacbe90294ad4af7404aaaa608673db90d",
      "size": 8215
    },
    "skills/shotpulled-dialing/SKILL.md": {
      "sha256": "f295ddff1e12e74d00401d7f1483bd71884ec9643db1c2fb4a55782ce9c86865",
      "size": 5492
    },
    "skills/shotpulled-dialing/agents/openai.yaml": {
      "sha256": "f12d111feb30904bccb71a4caaf4bfc0f000b30ad716dce5286463fb6d8dc924",
      "size": 743
    },
    "skills/shotpulled-dialing/assets/icon-large.png": {
      "sha256": "a5922e215c104d69f3f41e7b0001adc06d27d87d816ae4019bae5ece79d71905",
      "size": 24398
    },
    "skills/shotpulled-dialing/assets/icon-small.svg": {
      "sha256": "2ff52d186439ab99e8bf7dac620f9a444bcb6988ca93faf6f930002e55ff12bc",
      "size": 3911
    },
    "skills/shotpulled-dialing/references/knowledge-base.md": {
      "sha256": "0e20b0d2c6aa39da6d98e6dde4a2bd108cd8e981af984c8478b1da6148f21995",
      "size": 9558
    }
  }
}

SHA-256 of public snapshot: 9b2d6d853a05c5552a64287d49266d404f1e8e764e3f46dcbc2a84a36b1d3834