Tool

update_pin

Update pinChanges data

Description

Correct or enrich a pin: re-rate risk, payoff or scope, fix the summary, add files or links, refine the approach (set approach_stage when the user has worked it out with you). For "I hit this too", use add_sighting instead. Text fields replace; list fields (files, links, areas, gotchas) are added to unless you pass replace_lists: true. Returns the pin summary and the fields that changed; get_pin has the rest.

Parameters

idstringrequired

Pin key (e.g. ACME-42) or id. Picks the workspace: the key's prefix.

at least 1 characters

titlestring

5–200 characters

summarystring

10–4000 characters

kindstring

One ofbugdebtperformancesecuritytestingdxdocsfeature

riskstring

Cost of leaving it alone (for a feature, of going without it): how bad it gets when it bites, and how likely it is to bite. Severe harm that's unlikely is medium, not high; a long quiet history is evidence it's unlikely. critical, e.g. a security hole, lost or corrupted data, money charged wrongly, an outage now or imminent. high, e.g. users blocked from something they need, a frequent wrong result, a deadline that will break something, a likely incident. medium, e.g. a visible bug with a workaround, slow pages, flaky tests, code that will trip whoever changes it next. low, e.g. cosmetic issues, rare edge cases, harm that's only theoretical, messy code that works.

One oflowmediumhighcritical

payoffstring

Gain from doing it: how much better it makes things for the people it reaches, and how many it reaches how often; the product's users first, then the team. critical, e.g. a core workflow most users run daily, something customers leave or pay over. high, e.g. a capability users expect and keep asking for, friction or slowness the whole team hits every day, a big unlock for other work. medium, e.g. a real improvement for some users, friction the team hits now and then, a nicer path on a secondary screen. low, e.g. something one person noticed once, tidier code nobody sees, polish nobody would miss. Debt nobody sees stays low; if it blocks other pins, link them, and if waiting makes it costlier, set harder_later.

One oflowmediumhighcritical

scopestring

One oftrivialsmallmediumlargeepic

harder_laterboolean

True when waiting makes the fix costlier: data piling up that a migration must convert, an API or format others will start depending on, a one-way door. Raises priority.

areasstring[]

Existing areas of the pin's workspace. acme (acme/api): - auth: Sign-in, sessions and permissions - payments: Billing, invoices and checkout acme-mobile (acme/ios): - offline: Sync and offline storage

Your workspace's areas, e.g.authofflinepayments

1–3 items

filesobject[]

Repo-relative, e.g. src/auth.ts. Never absolute.

up to 50 items

pathstringrequired

Repo-relative path, e.g. src/auth.ts. Never absolute.

1–500 characters

linesstring

Line range, e.g. "40-88".

symbolstring

Function or class name.

up to 200 characters

snippetstring

The 1 to 5 lines that show the problem, copied exactly; not the function signature. Most useful when no symbol names the place, so the next agent can find it after the code moves.

up to 2000 characters

commitstring

Corrects the pin's commit. Files added in the same call are read at it too.

pattern: ^[0-9a-f]{7,40}$

confidencestring

One ofconfirmedsuspected

discoverystring

1–8000 characters

gotchasstring[]

up to 20 items · each 1–4000 characters

reprostring

1–8000 characters

approachstring

1–8000 characters

approach_stagestring

Whether a person shaped approach. proposed (default): your own idea; leave it. discussed: the user talked the fix through with you, but points are still open. agreed: the user settled the fix with you. Set discussed or agreed only when the user actually worked the approach out with you, at filing or later; never ask them to discuss a pin just to set it. agreed raises priority.

One ofproposeddiscussedagreed

done_whenstring

1–8000 characters

replace_listsboolean

Replace files, links, areas and gotchas instead of adding to them.

reasonstring

Why, shown in the pin's history.

up to 500 characters

Response

An example. The result sits in the same envelope as every tool's; see Responses.

JSON
{
  "workspace": {
    "slug": "acme",
    "name": "Acme"
  },
  "result": {
    "pin": {
      "key": "ACME-42",
      "url": "https://laterbase.dev/dashboard/pins/ACME-42",
      "title": "Session refresh races when two tabs refresh at once",
      "status": "open",
      "summary": "Two tabs refreshing an expired session at the same moment both rotate the refresh token; the loser is signed out.",
      "repo": "acme/api",
      "kind": "bug",
      "areas": [
        "auth"
      ],
      "risk": "high",
      "payoff": "high",
      "scope": "medium",
      "leverage": "medium",
      "priority": "critical",
      "claimed_by": null,
      "sightings": 2,
      "created_at": "2026-10-01T14:03:11.000Z",
      "status_changed_at": "2026-10-01T14:03:11.000Z"
    },
    "changed": [
      "scope"
    ]
  }
}

Input schema

Exactly what tools/list sends your agent.

JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Pin key (e.g. ACME-42) or id. Picks the workspace: the key's prefix."
    },
    "title": {
      "type": "string",
      "minLength": 5,
      "maxLength": 200
    },
    "summary": {
      "type": "string",
      "minLength": 10,
      "maxLength": 4000
    },
    "kind": {
      "type": "string",
      "enum": [
        "bug",
        "debt",
        "performance",
        "security",
        "testing",
        "dx",
        "docs",
        "feature"
      ]
    },
    "risk": {
      "description": "Cost of leaving it alone (for a feature, of going without it): how bad it gets when it bites, and how likely it is to bite. Severe harm that's unlikely is medium, not high; a long quiet history is evidence it's unlikely. critical, e.g. a security hole, lost or corrupted data, money charged wrongly, an outage now or imminent. high, e.g. users blocked from something they need, a frequent wrong result, a deadline that will break something, a likely incident. medium, e.g. a visible bug with a workaround, slow pages, flaky tests, code that will trip whoever changes it next. low, e.g. cosmetic issues, rare edge cases, harm that's only theoretical, messy code that works.",
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high",
        "critical"
      ]
    },
    "payoff": {
      "description": "Gain from doing it: how much better it makes things for the people it reaches, and how many it reaches how often; the product's users first, then the team. critical, e.g. a core workflow most users run daily, something customers leave or pay over. high, e.g. a capability users expect and keep asking for, friction or slowness the whole team hits every day, a big unlock for other work. medium, e.g. a real improvement for some users, friction the team hits now and then, a nicer path on a secondary screen. low, e.g. something one person noticed once, tidier code nobody sees, polish nobody would miss. Debt nobody sees stays low; if it blocks other pins, link them, and if waiting makes it costlier, set harder_later.",
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high",
        "critical"
      ]
    },
    "scope": {
      "type": "string",
      "enum": [
        "trivial",
        "small",
        "medium",
        "large",
        "epic"
      ]
    },
    "harder_later": {
      "description": "True when waiting makes the fix costlier: data piling up that a migration must convert, an API or format others will start depending on, a one-way door. Raises priority.",
      "type": "boolean"
    },
    "areas": {
      "description": "Existing areas of the pin's workspace.\nacme (acme/api):\n- auth: Sign-in, sessions and permissions\n- payments: Billing, invoices and checkout\nacme-mobile (acme/ios):\n- offline: Sync and offline storage",
      "minItems": 1,
      "maxItems": 3,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "auth",
          "offline",
          "payments"
        ]
      }
    },
    "files": {
      "description": "Repo-relative, e.g. `src/auth.ts`. Never absolute.",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "description": "Repo-relative path, e.g. src/auth.ts. Never absolute."
          },
          "lines": {
            "description": "Line range, e.g. \"40-88\".",
            "type": "string"
          },
          "symbol": {
            "description": "Function or class name.",
            "type": "string",
            "maxLength": 200
          },
          "snippet": {
            "description": "The 1 to 5 lines that show the problem, copied exactly; not the function signature. Most useful when no symbol names the place, so the next agent can find it after the code moves.",
            "type": "string",
            "maxLength": 2000
          }
        },
        "required": [
          "path"
        ]
      }
    },
    "commit": {
      "description": "Corrects the pin's commit. Files added in the same call are read at it too.",
      "type": "string",
      "pattern": "^[0-9a-f]{7,40}$"
    },
    "confidence": {
      "type": "string",
      "enum": [
        "confirmed",
        "suspected"
      ]
    },
    "discovery": {
      "type": "string",
      "minLength": 1,
      "maxLength": 8000
    },
    "gotchas": {
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 4000
      }
    },
    "repro": {
      "type": "string",
      "minLength": 1,
      "maxLength": 8000
    },
    "approach": {
      "type": "string",
      "minLength": 1,
      "maxLength": 8000
    },
    "approach_stage": {
      "description": "Whether a person shaped `approach`. proposed (default): your own idea; leave it. discussed: the user talked the fix through with you, but points are still open. agreed: the user settled the fix with you. Set discussed or agreed only when the user actually worked the approach out with you, at filing or later; never ask them to discuss a pin just to set it. agreed raises priority.",
      "type": "string",
      "enum": [
        "proposed",
        "discussed",
        "agreed"
      ]
    },
    "done_when": {
      "type": "string",
      "minLength": 1,
      "maxLength": 8000
    },
    "links": {
      "description": "How this pin relates to other pins and to PRs, commits, branches, issues or sessions: { relation, pin } or { relation, artifact, kind? }. found_in: where you found it. fixed_in: the PR or commit that fixes it; link it as soon as the PR is open, not only once it merges. related: loosely connected; pin keys, PRs, issues and commits you mention in the pin's text are linked as related for you, so cite them freely. blocks: another pin can't start or ship until this one is done. blocked_by: the same link from the other side, when this pin can't start or ship until another is done; to track a release, give the release pin a blocked_by for each pin it needs. duplicate_of: another pin covers this. e.g. { \"relation\": \"found_in\", \"artifact\": \"#212\" }, { \"relation\": \"blocks\", \"pin\": \"ACME-14\" }, { \"relation\": \"blocked_by\", \"pin\": \"ACME-9\" }.",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "relation": {
            "type": "string",
            "enum": [
              "found_in",
              "fixed_in",
              "related",
              "blocks",
              "duplicate_of",
              "blocked_by"
            ]
          },
          "pin": {
            "description": "Another pin's key, e.g. ACME-42.",
            "type": "string",
            "minLength": 1,
            "maxLength": 50
          },
          "artifact": {
            "description": "A URL, owner/name#123, #123 (this pin's repo), a commit SHA or a branch name.",
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "kind": {
            "description": "What `artifact` is when the text can't say: a branch name, an issue number, an agent session.",
            "type": "string",
            "enum": [
              "pr",
              "commit",
              "branch",
              "issue",
              "session",
              "url"
            ]
          }
        },
        "required": [
          "relation"
        ]
      }
    },
    "replace_lists": {
      "description": "Replace files, links, areas and gotchas instead of adding to them.",
      "type": "boolean"
    },
    "reason": {
      "description": "Why, shown in the pin's history.",
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "id"
  ]
}