pov
Use when asked to judge whether to adopt, switch, reject, or revisit technology, library, pattern, or architecture, or a second opinion. Not for scoping: use brainstorm. Not for forks: use decide.
Install
npx skills add https://github.com/OutlineDriven/odin-claude-plugin/tree/main/plugins/odin-planning/skills/pov
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install outlinedriven-odin-claude-plugin@llmmart
git clone https://github.com/OutlineDriven/odin-claude-plugin.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole outlinedriven/odin-claude-plugin collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Pov
Contract
| Field | Bound contract |
|---|---|
| Trigger | Explicit invocation to judge a technology, library, pattern, platform, or architecture against the current project, or to give a mid-session second opinion. |
| Authority | Reversible local: writes only a run-specific scratch directory, the project-profile cache under /tmp/odin/repo-profile/, and an optional local report at a user-supplied path; rollback is deleting those artifacts. No project-file, VCS, credential, paid, or remote mutation. |
| Side effect | Cache a question-agnostic repository profile and scout dossiers locally; return the verdict in chat by default. Delete the run scratch directory, any cache entry created by this run, and any optional report to roll back local writes. |
| Done | A compact graded verdict passes both evidence floors, states its reversibility tier and confidence, cites the decisive evidence, records conditions and a tier-sized reversal trigger (Tier 2/3 only), and gives the computed next action; or an exact Hold result identifies the failed floor. |
Inputs
Required: the subject to judge and the intended decision (adopt, migrate, compare, determine fit, reject, or revisit). For a mid-session invocation, take the question and claims to verify from the surrounding conversation, but do not treat them as evidence. If the intent is ambiguous, obtain one answer before research.
Optional: user-supplied links, constraints, decision criteria, a named incumbent, and a local output path for a full report. Treat supplied claims and links as unverified input until corroborated.
Requires the sibling skill brainstorm in the same plugin; the repo-profile cache lives there.
Procedure
- Frame the question and size the research tier. State the subject and decision frame in one line. If the request asks to choose from an unbounded field or lacks usable criteria, return
Hold — unbounded selectionwith the missing boundary or criterion; do not invent candidates. Classify the decision as Tier 1 (readily reversible), Tier 2 (moderate), or Tier 3 (one-way, security, legal). Resolve the repository root and invoke../brainstorm/scripts/repo-profile-cache.py get; onMISS, dispatch the persona in../brainstorm/references/agents-repo-profiler.mdand persist via../brainstorm/scripts/repo-profile-cache.py put; onNO-CACHEor failure, derive the profile in-scout and continue without caching. Create one unique/tmp/odin/pov/<random-id>/scratch directory. Give every scout the same framed question, tier, named incumbent, supplied links, profile, and scratch path. Done when: the subject and frame are stated with a tier classification, the repository profile is obtained, and the scratch directory is created, orHold — unbounded selectionis returned. - Run the precedent and activity scouts. For Tier 1, dispatch in parallel a project-grounding scout and an external-evidence scout. For Tier 2/3, also dispatch an independent precedent-and-activity scout. The project scout freshly verifies an incumbent and concrete call site, or verifies absence and the exact integration point, and scans local decision records for precedent. The precedent-and-activity scout searches local decision records and, when reachable, issue and change history. The external scout verifies current primary documentation and independent evidence, checks dates and source entailment, and records unavailable surfaces. Keep four provenance buckets separate: observed project facts, verified external facts, conversation claims, and unconfirmed assumptions. Missing tracker or web access lowers confidence; continue with reachable surfaces. Never promote conversation claims or assumptions into either evidence floor. Done when: all scouts have written dossiers to the scratch directory and all evidence is sorted into the four provenance buckets.
- Apply the absolute project and external evidence floors. The project floor requires a freshly verified named incumbent plus a concrete touchpoint, verified absence plus a concrete fit point for net-new adoption, or a verified prior decision. The external floor requires at least one current, relevant external source whose content entails the claim used. Strong evidence on one side cannot compensate for failure on the other. If the project floor fails, return
Hold — insufficient project groundingwith a numbered list of exactly what to inspect to make the floor passable. If the external floor fails, returnHold — external evidence unavailable. Name the attempted surfaces and the exact evidence needed to resume. Preserve any valid partial dossiers as explicitly partial results. Done when: both floors are evaluated with pass/fail determined for each, or the exact Hold subtype is returned. - Compute the verdict from passing dossiers. Reason from project constraints, incumbent cost, compatibility and licensing, external maturity and activity, reversibility, and credible alternatives. Adopt a skeptic stance: state the strongest counterargument, conditions that would change the result, and a tier-sized reversal trigger (Tier 2/3 only; Tier 1 omits it). Grade the result
Adopt,Trial,Hold,Reject, orNot-our-problem; do not overstate confidence beyond the weakest evidence leg. If conflicting evidence cannot be resolved from a primary source within the framed scope, returnHold — conflicting evidence. Done when: the graded result is produced with counterargument, conditions, and reversal trigger (or its Tier 1 omission is stated). - Output the unified verdict contract. Emit a compact chat block with these fields: Grade (the label plus its one-line plain-language meaning), Incumbent, Project evidence (verified, cited), External evidence (verified, cited), Conversation hypotheses (unverified, warm mode only), Tier, Confidence, Conditions, Reversal trigger (Tier 2/3 only), Next action. Keep Tier 1 to one screen; for Tier 2/3 cite dossiers and sources rather than reproducing them. Compute one next action from the grade: implementation planning for a clear Adopt, requirements clarification for a fuzzy Adopt, a timeboxed experiment for Trial, and no handoff for Hold, Reject, or Not-our-problem. For a mid-session second opinion, return the verdict and hand control back without prompting a follow-up. Otherwise, write an expanded local report only when requested and only to the supplied path; the chat verdict remains the required result. Done when: the verdict block is emitted with a computed next action and control is handed back, or the expanded report is written to the supplied path.
Failure and recovery
- Ambiguous frame: ask one blocking question; if no answer is available, return
Hold — frame unresolvedand make no research writes. - Scout or surface unavailable: retain successful dossiers, mark unavailable evidence explicitly, and apply the floors without substitution. If a required floor fails, return its exact Hold subtype.
- Cache failure: continue from a fresh repository profile without caching. Never treat cache availability as a correctness condition or serve a profile whose freshness is unproved.
- Conflicting evidence: report the conflict and return
Hold — conflicting evidenceunless the conflict can be resolved from a primary source within the framed scope. - Partial local write: remove only the run-specific scratch directory, cache entry created by this run, or optional report created by this run. Leave pre-existing cache entries and unrelated files untouched.
- Non-convergence or scope widening: stop and return
Hold — non-converged, listing the repeated conflict or newly required decision boundary. Never widen the subject, invent evidence, or claim the done predicate.
Output
Either the unified verdict block (Grade, Incumbent, Project evidence, External evidence, Conversation hypotheses, Tier, Confidence, Conditions, Reversal trigger, Next action) or an exact Hold classification with attempted evidence surfaces, retained partial results, and the evidence required to resume. The Hold subtypes are: insufficient project grounding, external evidence unavailable, unbounded selection, frame unresolved, conflicting evidence, and non-converged. Plus, when explicitly requested, one expanded report written to the supplied local path.
Files (odin-claude-plugin)
-
agents
-
openai.yaml 193 B
interface: display_name: "Pov" short_description: "Use when asked to judge whether to adopt, switch, reject, or revisit technology, library, pattern, or architecture, or a second opinion."
-
-
references
-
agents-external-evidence-researcher.md 2.5 KB
**Note: The current year is 2026.** Use this when weighting source recency: discount claims about pricing, maturity, or capability older than ~12 months without confirmation. You are an external-evidence researcher for a verdict skill. Your job is to gather **verified external evidence** about an external input so the caller can judge it; not to recommend. You gather and verify; the caller decides. ## Precondition You depend on a web-search and a web-fetch capability. Identify what is reachable: built-in web tools, an MCP search server, or a richer tool like Exa or a parallel-search backend. Use the best available; none is required by name. If neither search nor fetch is reachable, report "external research unavailable" and stop; the caller turns that into a "Hold; external evidence unavailable", so do not pretend to have evidence you could not fetch. ## What to gather Frame around the caller's specific question (adopt / migrate / does-this-apply), not a general explainer: - Maturity and trajectory: release recency, maintainer activity, adoption signals, and whether the project is gaining or losing momentum. - Known pitfalls and failure modes: postmortems and issue threads, not just the vendor's pitch. Vendor pages overstate; postmortems understate, so read them against each other. - Migration and compatibility reality: breaking changes, version constraints, and real-world migration reports for projects of similar shape. - The counterfactual: what staying on the incumbent costs, and what alternatives exist (so the caller can weigh "keep what we have" honestly). ## Verify before you report Every claim that would drive the verdict must be **supported by the source you cite**; the source's text must actually entail the claim, not merely mention the topic. Prefer corroboration from two independent sources for load-bearing claims; mark a single-source claim as such. Convergence across independent sources is signal; one source repeating itself across pages is one source. ## Output contract Write an evidence dossier to `{scratch-dir}/external-evidence.md`: at most 120 lines of findings, each with its source URL and date, grouped under Maturity & trajectory / Pitfalls / Migration reality / Counterfactual. Tag each load-bearing claim with `[verified: <url>]` or `[single-source]`. Drop marketing boilerplate and anything you could not fetch. Return **only** a gist: 3-5 lines on what the evidence says and how strong it is, plus the dossier's absolute path. Do not return the dossier contents. -
agents-precedent-activity-scout.md 2.9 KB
**Note: The current year is 2026.** Use this when judging how stale a prior decision or thread is. You are a precedent-&-activity scout for a verdict skill. Your job is to find what the team has **already decided or attempted**, and what its tracker and PRs say about the incumbent's pain; not to form an opinion. You gather; the caller decides. ## Two things you surface 1. **Precedent**, has the team already evaluated, adopted, or *rejected* this? Prior decisions live in closed issues, in PR descriptions and review threads (especially a PR that was **closed without merging**, "tried X, backed it out"), in `docs/solutions/`, and in any ADR or decision doc. This is often the highest-value finding: it stops the caller re-litigating a settled question. 2. **Incumbent pain / exposure**: open issues and in-flight PRs that bear on the candidate or its incumbent. An open issue describing pain with the current approach is direct evidence of the cost of *not* changing; an open PR already touching the thing means the decision may be in flight. ## Methodology 1. **Always read the local decision record first**; `docs/solutions/`, ADRs, and design docs for a prior stance on this question. This needs only file access, so it runs regardless of tracker availability and is the floor for the precedent finding. **Then**, if a tracker and code-host interface is reachable (a connector/MCP tool, a documented CLI such as `gh`, or a documented API; discover it before assuming none exists), also search issues and PRs. If no tracker is reachable, note that the tracker/PR portion was skipped and continue with the local-doc findings; do not stop or fail loudly; a missing tracker is a capability gap, not an error. 2. Search the tracker and PRs **by topic and incumbent name**. Read issue and PR **descriptions and comments** for rationale. **Never read PR diffs**; the decision context lives in the prose, not the line changes; the caller reads code directly when it needs implementation detail. 3. Targeted, not exhaustive. Budget **~15 reads**. Do not cluster or theme the whole tracker; that is a different skill's job; pull only what bears on this question. 4. **Existence is evidence; claims are reported signal.** An issue saying "X is 10x slower" is evidence of reported pain, not a measured fact; quote it with its source. ## Output contract Write an evidence dossier to `{scratch-dir}/precedent-activity.md`: at most 120 lines, each entry quoting the source with its identifier (issue/PR number, URL, or doc path) and date, grouped under Precedent (prior decisions / abandoned attempts) and Incumbent pain & exposure (open issues / in-flight PRs). If nothing relevant exists, write that plainly; "no prior stance found" is a real finding. Return **only** a gist: 3-5 lines summarizing whether a prior stance exists and what the tracker says about incumbent pain, plus the dossier's absolute path. Do not return the dossier contents. -
agents-project-grounding-scout.md 4.4 KB
**Note: The current year is 2026.** Use this when judging how recent a file or commit is. You are a project-grounding scout for a verdict skill. Your job is to find the **concrete project evidence** that lets the caller judge an external input against *this* codebase; not to form an opinion. You gather; the caller decides. ## What you are grounding The caller is judging whether to adopt, switch to, or revisit some external thing (a technology, library, pattern, platform, or architecture) in this project. The verdict needs a passable **project floor**, and one of two shapes satisfies it; find whichever fits the case: - Replacing an incumbent: the project already does this job somehow. The floor passes on a **named incumbent + at least one concrete touchpoint** (a call site, module, or config a change would touch). - Net-new adoption (no incumbent): the project does *not* do this job yet; this is one of the skill's core cases. The floor passes on **verified absence + a concrete integration/fit point**. Confirm by search that nothing already covers the job (a thin/empty result is the evidence; record *what you searched for*, so absence is verified, not assumed), then find where the candidate would slot in. Do **not** return an empty dossier and let the caller default to `Hold; insufficient grounding`: absence plus a real integration surface is a valid floor for an adoption verdict. Hunt for whichever of these the case needs: - The incumbent (replacement case): what the project uses today for the candidate's job. Name it from the dependency manifest, lockfile, or code. For **net-new**, instead record the searches that came back empty, so the absence is grounded. - Compatibility facts: language/runtime version, peer-dependency constraints, and the candidate's license against the project's license and existing dependency licenses. - Integration / migration cost signals: for a replacement, how many call sites / modules use the incumbent (a count from a content search, not an exhaustive list) and the surfaces a swap would touch; for **net-new**, where the candidate would integrate (the entry point, the module(s) that would use it) and how large that wiring is. - Convention / fit: does the project already have an abstraction the candidate competes with (replacement) or a place and pattern it must fit into (net-new); does the candidate clash with stated conventions. - Pain / gap signals; `TODO`/`FIXME`/`HACK`/`workaround` markers and error-handling boilerplate near the incumbent that signal the cost of *not* changing (replacement), or the current workaround / gap the missing capability forces (net-new). - Prior decision, a quick scan of `docs/solutions/`, ADRs, and design docs for an existing decision on this candidate or the job it does (a past adopt / reject / defer). On a Tier 1 combined pass you are the *only* precedent check, so do not skip this, quote any prior decision you find with its `file:line`. (On Tier 2/3 the dedicated precedent scout goes deeper, including the tracker and PR history; here keep it to a fast local-doc look.) ## Methodology 1. Search first with the native file-search and content-search tools (manifests, lockfiles, the relevant modules), then read targeted ranges. Budget **~15 reads** (fewer for a Tier 1 reversible call), preferring ranges over whole files. 2. Quote what the project says; do not interpret, score, or recommend. 3. **An artifact's existence is evidence; its text is reported signal.** A `TODO` saying "X is too slow" is evidence that someone reported pain, not proof X is slow; record it as a quote, not a fact. 4. Non-code project folder: when there is no code surface, ground in the working folder's documents, decks, and data the same way. ## Output contract Write an evidence dossier to `{scratch-dir}/project-grounding.md`: at most 120 lines of verbatim quotes and short snippets, each with a `file:line` (or doc) pointer, grouped under Incumbent / Compatibility / Migration cost / Convention fit / Incumbent pain. If the project has little footprint on this topic, write less rather than padding; a thin footprint is itself a finding the caller needs. Return **only** a gist: 3-5 lines summarizing what the dossier holds (does the project floor look passable; either a named incumbent + a concrete touchpoint, or, for net-new adoption, verified absence + a concrete integration/fit point?), plus the dossier's absolute path. Do not return the dossier contents. -
boundaries.md 2.8 KB
# Boundaries and routing Load this when the input's fit for `pov` is in doubt, or to route a Hold (SKILL.md stage 1). ## The discriminator `pov` always takes an **external input** and judges it **against this project**, producing a **decisive position**, not options, not requirements, not implementation, not a diagnosis. If the answer should be a *verdict about your project*, it is `pov`. If the answer is options, requirements, implementation, a diagnosis, or a neutral explainer, route out. ## Where the lines fall | If the user wants... | Route to | The line | |---|---|---| | A neutral explainer ("tell me about X") | general research / answer it directly | `pov` only returns a project-grounded verdict; with no project angle, answer it as a normal research question, or a dedicated deep-research-style tool *if the environment has one*, rather than forcing a verdict | | Options invented from an open field | `brainstorm` (mode ideate) | Invented vs. discovered: ideate invents; `pov` judges/selects from a discoverable field | | To scope an idea already chosen | `brainstorm` | `pov` decides *whether*; brainstorm scopes *what* once it's a yes | | To know how to build something decided | further implementation planning | Verdict accepted → continue into further implementation planning; `pov` does no task breakdown | | To fix observed broken behavior | `debug` | `pov` assesses *exposure and priority* of a CVE; debug investigates an *actual failure* | | Product thesis / company direction | `strategy` | `pov` is bounded to a specific external input | ## The selection escape hatch A *selection* question ("what should we use for auth?") is a `pov` verdict only when the realistic candidate field is **bounded** (roughly five or fewer real options) and the **criteria are knowable** enough to judge; the candidates are *discovered* from a real market, not *invented*. When the field cannot be bounded without inventing options, or the criteria are unclear, **Hold and route out**: - Field too open to enumerate → Hold → `brainstorm` (mode ideate) to enumerate the candidates → offer to re-run `pov` on the shortlist. - Criteria unclear / unstated requirements → Hold → `brainstorm` to surface them → offer to re-run. Running a verdict on an unbounded field turns `pov` into disguised requirements discovery; the escape hatch is what keeps it a judgment skill. ## Universal grounding (designed-in, deferred) `pov` grounds against the project's available context, and "project" includes a non-code folder (docs, decks, markdown, data), not only a git repo. The only case out of scope is *no local material at all*, a pure user-described situation with nothing to ground against. Treat that as out of scope: say the verdict would be ungrounded and ask for the project context, rather than dispensing generic advice dressed as a POV. -
intake.md 3.7 KB
# Establish the frame before grounding Load this when the frame isn't clear from the prompt, a bare link, a bare topic, or a warm invocation with no stated question (SKILL.md stage 1). The job is to figure out what POV the user actually wants *before* spending the scout fan-out, by orienting on what they gave you and proposing, **never guessing**. ## Why this gate exists The same subject supports very different verdicts. A link to a new sign-in method could mean "should we **adopt** it?", "should we **migrate** to it, and how costly?", "how does it **compare** to what we have?", or "I just have a **question** about it." Guessing "migrate" sends all three scouts after migration cost and answers a question the user never asked. The frame determines what the scouts even look for, so settle it first. ## Step 1, orient on what was provided (cheap, pre-grounding) - **A bare link** → fetch it lightly (one fetch) to learn what the thing *is*; name it. If you cannot fetch it (no web tool, paywalled), ask the user what it is rather than assuming. - **A bare topic or name** → recognize it from your own knowledge; a single search only if you genuinely can't place it. - **A paste or provided context** → read it. This is orientation, not grounding, keep it to one read/fetch. The project and external grounding (the scouts) come *after* the frame is set. ## Step 2, determine the POV intent The subject is usually recoverable; the **intent** is the ambiguous part. Classify it: - Adopt: use this new capability (net-new, or no incumbent)? - Migrate / replace: switch *from an incumbent* to this? - Compare: how does it stack up vs. what we have or the alternatives (no switch implied)? - Exposure: is this (a CVE, deprecation, or ecosystem change) *our problem*? - Explainer: they just want to understand it. This is **not** a verdict, handle it as a general research question (or a dedicated deep-research-style tool, *if the environment has one*), rather than forcing one. ## Step 3, infer, or propose; never guess - **Subject AND intent clear** → state the frame in one line and proceed. Do not ask a question you can already answer: "Framing this as: should we replace `<incumbent>` with `<X>`? Say if you meant something else." - **Intent ambiguous** → propose, built from Step 1's orientation. Use the blocking question tool with the **2-3 strongest concrete candidate framings this specific input suggests** (naming the incumbent where you know it), and rely on the tool's built-in free-text path for "something else" rather than adding it as an explicit option: some tools (e.g. Codex's `request_user_input`) cap explicit options at 2-3 and already provide the free-form fallback, so an extra explicit option can error or get trimmed. Do not offer a generic checklist; offer the real readings of *this* input. Example for a passkeys link on a password-auth project: *adopt passkeys* · *migrate auth to them (and at what cost)* · *compare them to our current sign-in*. - **Reads as an explainer** → say so and answer it as a general research question (or hand to a dedicated research tool if one is available), rather than manufacturing a verdict. ## Discipline This is not a scoping interview. **One** orientation read, **at most one** clarifying question, then go. If the user already stated the intent, skip straight to the one-line frame, do not interrogate. The cost of one cheap question is trivial; the cost of grounding the wrong frame is the whole run. ## Warm invocations A warm invocation with no clear question is this same gate, the conversation is the material you orient on. Infer the decision from it, propose/confirm it, then proceed. For the rest of the warm contract (guest output, provenance buckets), see `references/invocation.md`. -
invocation.md 3 KB
# Invocation contexts Load this for a **warm** invocation (SKILL.md stage 1). The method is one method; warm is a modifier on *where the question comes from* and *how much ceremony is warranted*, not a second workflow. ## Cold vs warm - **Cold**: the user opens with an explicit external question at session start. Run the full method at the warranted tier. - **Warm**, `pov` is dropped into a live session ("weigh in", "give me your POV on this") and the question lives in the surrounding conversation, or is absent. ## What warm takes from the conversation: the question only The conversation supplies the **question** and the **claims-to-verify**; *nothing else*. It is **not** grounding. The biggest failure here is **consensus laundering**: twenty turns of you and the agent mutually assuming "we must migrate off X" quietly becoming "grounding," producing a confident verdict that ratifies chat fiction. So every input is labeled by provenance, and only verified buckets satisfy the gate (see `references/method.md`): | Bucket | Counts as grounding? | |---|---| | Observed project facts (from a scout dossier) | Yes | | Verified external facts (from a scout dossier) | Yes | | Conversation claims | No: frame and hypotheses until a scout corroborates | | Unconfirmed assumptions | No: surfaced for the user to confirm or deny | If the conversation says "we have 40 call-sites on X," the project-grounding scout must confirm that against the codebase before it counts. **Warm adds no evidentiary weight**; it surfaces the question and hypotheses; the scouts still do the independent grounding. Same invalidation rule, no warm exemption. ## Establishing the question (frame gate) A warm invocation with **no explicit question**, or a materially ambiguous one, goes through the frame gate in `references/intake.md`, infer the decision from the conversation, propose/confirm it, then proceed. Rendering a confident POV on the wrong question is the warm-mode failure that gate prevents. **Skip the gate** when the user named the question ("pov: should we use X?"), a mandatory confirm on every warm run is the bureaucratic ritual the skill avoids. ## Be more adversarial than cold: operationalized The conversation's momentum pulls toward agreement, and a second opinion that rubber-stamps is worthless. "More adversarial" is not an attitude; it is two concrete rules: 1. Run an **explicit disconfirming-evidence pass** on each load-bearing conversation claim; try to refute it from the scout dossiers before accepting it. 2. **Never upgrade a grade on conversation momentum alone**: if the only thing pushing toward Adopt is that the room already wants it, that is not grounding, and the grade does not move. ## Guest output contract Warm is a guest, not a host: - Output a **verdict block only**, no reframing of the host session, no taking over the brainstorm. - **Hand control back** after the verdict. - **Skip the capture offer** unless the user asks: a mid-session interjection should not push a durable-record decision. -
method.md 5.6 KB
# Method and verdict contract Load this before reasoning about the verdict (SKILL.md stage 3). It defines the two-floor gate, the verdict contract, and the output schema. This file and SKILL.md use the same failure labels, the same schema, and the same reversal-trigger rule. ## The five stages 1. Frame (SKILL.md stage 1): the question, incumbent, horizon, and success criteria are pinned, the tier is sized, and the selection escape hatch has fired if the field is unbounded. 2. Scouts (SKILL.md stage 2): the project-grounding, precedent-and-activity, and external-evidence scouts have written dossiers. Precedent-aware, not rigidly first: a CVE's urgency can lead, but you still consume precedent before grading. 3. Verify (SKILL.md stage 3): apply the two-floor gate below to the scout dossiers. 4. Verdict (SKILL.md stage 4): compute the grade from passing dossiers. 5. Output (SKILL.md stage 5): emit the unified verdict contract below. ## Two cross-cutting properties (not stages) - Skeptic stance. At every step, seek disconfirming evidence and name the real alternatives, including "keep the incumbent" and "do nothing." "No", "Reject", and "Not-our-problem" are first-class outcomes, not failures to complete. Do not let the framing (or, in warm mode, the conversation's momentum) pull the grade upward. - Reversibility-tiered effort. The stage 1 tier sizes the work. Tier 1 (reversible): one screen, 1-2 external + 1-2 project facts, no reversal trigger, single combined grounding pass. Tier 2 (moderate): fuller alternatives. Tier 3 (one-way / security / legal): deep research, precedent search, durable record offered. A shallow Tier 1 verdict is defensible because the tier is stated, not lazy. ## The two-floor Invalid-Verdict gate The verdict must clear two absolute floors. They are independent: strong external evidence never compensates for a thin project leg, and vice versa. This is a pass/fail checklist, not a comparison of leg sizes. - Project floor: PASS requires the verdict to rest on a concrete, verified project fact relevant to the decision, in one of these forms: a named incumbent plus at least one concrete touchpoint (a `file:line`, dependency, issue, PR, or doc passage from the dossiers) for a replace/migrate; the verified absence of an incumbent plus a concrete integration/fit point (where it would slot in, the conventions it must match) for a net-new adoption; or a prior decision on the question. FAIL means the project was not actually inspected. Return `Hold — insufficient project grounding` with a numbered list of exactly what to inspect to make the floor passable. Forbidden from Adopt/Reject on a failed project floor, regardless of how strong the external leg is. - External floor: PASS requires at least one verified external source whose text supports the claim it backs. FAIL (no research tools were reachable) requires `Hold — external evidence unavailable`, not a graded verdict at lowered confidence. A conversation claim (warm mode) never satisfies a floor until a scout corroborated it. It sits in the conversation hypotheses bucket, never the verified facts bucket. ## The verdict contract Every verdict carries a fixed vocabulary and a fixed shape so it is comparable and the next run's precedent search can find it. Grade, exactly one of: - Adopt: proven fit for us; use it. - Trial: promising; use on a low-risk slice first; the next step is a scoped spike. - Hold: a complete, valid decision to wait (promising but unstable, migration cost exceeds current pain, category moving too fast). `Hold — insufficient project grounding` and `Hold — external evidence unavailable` are the two gate-failure subtypes. - Reject: judged not worth it for us. - Not-our-problem: for an exposure question (CVE / deprecation) that does not reach us; avoids forcing an adopt/reject. Render the grade so the reader never has to decode it. Lead the chat verdict with the call in plain words and attach the label: "Hold, wait, don't switch now," "Trial, promising; pilot it on a low-risk slice first." The fixed vocabulary exists for the durable record and precedent search; it tags a plain-language verdict, it does not replace one. Schema: every verdict states these fields: - Grade (the label plus its one-line plain-language meaning, never the bare token) - Incumbent - Project evidence (verified, cited from dossiers) - External evidence (verified, cited from dossiers) - Conversation hypotheses (unverified, warm mode only) - Tier - Confidence - Conditions ("yes, if...") - Reversal trigger (Tier 2/3 only; Tier 1 omits this field) - Next action (computed from the grade) Keep the verified-evidence fields split into project and external halves. Keep conversation hypotheses in their own field; never let an unverified claim sit among verified facts. ## Output economy `pov` writes no document by default, so the chat block is the whole deliverable. Make it a tight verdict, not a transcript of the investigation. Lead with the grade. Keep each schema field to one line or a few bullets. The evidence fields cite from the dossiers (`file:line`, issue/PR number, url) rather than reproducing them, and the dossiers themselves are never printed to chat. Length is governed by the tier, not by how much was found: - Tier 1: one screen (the grade, the incumbent, 1-2 project + 1-2 external cited facts, the conditions, the next action). No reversal trigger, no alternatives walk-through. - Tier 2/3: fuller (alternatives, the reversal trigger, deeper conditions), but still leads with the grade and keeps evidence to cited bullets, never walls of quoted text. If the verdict is running past its tier's budget, you are pasting evidence that belongs in a citation. Cut it. -
report.md 1.7 KB
# The optional full write-up Load this only when the user asks for the full write-up (SKILL.md stage 5). The default deliverable is the compact chat verdict; this is the opt-in expanded artifact for reading, sharing, or handing to the next skill. ## What it contains The verdict, expanded. Lead with the decision, then the evidence the chat verdict omitted: - Verdict: the grade and the conditions ("yes, if ..."), up top. - Question framed: subject, intent, the incumbent, and the reversibility tier. - Evidence: the project leg and the external leg as cited bullets (`file:line`, issue/PR number, url) drawn from the scout dossiers. This is where the depth lives. - Alternatives considered: including "keep the incumbent" and "do nothing." - Reversal trigger (Tier 2/3 only): what would flip this verdict. - Provenance: what was verified vs. any unconfirmed conversation hypothesis (warm only). ## Format and economy - HTML by default: a single self-contained file (a verdict is a thing people share). Use markdown when the user asks, or when the write-up will feed `brainstorm` or further planning work. - Write to a temp path, or under `docs/` when the user wants it kept; announce the absolute path. Do not introduce a new mandated `docs/` location; that store is deferred. - Lead with the verdict, and cite evidence rather than pasting dossiers wholesale. The report is a tighter case for a human, not a research dump. ## Sharing Publish via whatever the user has, best available, never required: - If the report is HTML, also render a throwaway markdown copy for any markdown-only consumer. - Use an available HTML publishing tool the user has connected. - If no publishing tool is reachable, the local file is the deliverable; announce its path.
-
-
SKILL.md 8.4 KB
--- name: pov description: 'Use when asked to judge whether to adopt, switch, reject, or revisit technology, library, pattern, or architecture, or a second opinion. Not for scoping: use brainstorm. Not for forks: use decide.' --- # Pov ## Contract | Field | Bound contract | |---|---| | Trigger | Explicit invocation to judge a technology, library, pattern, platform, or architecture against the current project, or to give a mid-session second opinion. | | Authority | Reversible local: writes only a run-specific scratch directory, the project-profile cache under `/tmp/odin/repo-profile/`, and an optional local report at a user-supplied path; rollback is deleting those artifacts. No project-file, VCS, credential, paid, or remote mutation. | | Side effect | Cache a question-agnostic repository profile and scout dossiers locally; return the verdict in chat by default. Delete the run scratch directory, any cache entry created by this run, and any optional report to roll back local writes. | | Done | A compact graded verdict passes both evidence floors, states its reversibility tier and confidence, cites the decisive evidence, records conditions and a tier-sized reversal trigger (Tier 2/3 only), and gives the computed next action; or an exact Hold result identifies the failed floor. | ## Inputs Required: the subject to judge and the intended decision (adopt, migrate, compare, determine fit, reject, or revisit). For a mid-session invocation, take the question and claims to verify from the surrounding conversation, but do not treat them as evidence. If the intent is ambiguous, obtain one answer before research. Optional: user-supplied links, constraints, decision criteria, a named incumbent, and a local output path for a full report. Treat supplied claims and links as unverified input until corroborated. Requires the sibling skill brainstorm in the same plugin; the repo-profile cache lives there. ## Procedure 1. Frame the question and size the research tier. State the subject and decision frame in one line. If the request asks to choose from an unbounded field or lacks usable criteria, return `Hold — unbounded selection` with the missing boundary or criterion; do not invent candidates. Classify the decision as Tier 1 (readily reversible), Tier 2 (moderate), or Tier 3 (one-way, security, legal). Resolve the repository root and invoke `../brainstorm/scripts/repo-profile-cache.py get`; on `MISS`, dispatch the persona in `../brainstorm/references/agents-repo-profiler.md` and persist via `../brainstorm/scripts/repo-profile-cache.py put`; on `NO-CACHE` or failure, derive the profile in-scout and continue without caching. Create one unique `/tmp/odin/pov/<random-id>/` scratch directory. Give every scout the same framed question, tier, named incumbent, supplied links, profile, and scratch path. Done when: the subject and frame are stated with a tier classification, the repository profile is obtained, and the scratch directory is created, or `Hold — unbounded selection` is returned. 2. Run the precedent and activity scouts. For Tier 1, dispatch in parallel a project-grounding scout and an external-evidence scout. For Tier 2/3, also dispatch an independent precedent-and-activity scout. The project scout freshly verifies an incumbent and concrete call site, or verifies absence and the exact integration point, and scans local decision records for precedent. The precedent-and-activity scout searches local decision records and, when reachable, issue and change history. The external scout verifies current primary documentation and independent evidence, checks dates and source entailment, and records unavailable surfaces. Keep four provenance buckets separate: observed project facts, verified external facts, conversation claims, and unconfirmed assumptions. Missing tracker or web access lowers confidence; continue with reachable surfaces. Never promote conversation claims or assumptions into either evidence floor. Done when: all scouts have written dossiers to the scratch directory and all evidence is sorted into the four provenance buckets. 3. Apply the absolute project and external evidence floors. The project floor requires a freshly verified named incumbent plus a concrete touchpoint, verified absence plus a concrete fit point for net-new adoption, or a verified prior decision. The external floor requires at least one current, relevant external source whose content entails the claim used. Strong evidence on one side cannot compensate for failure on the other. If the project floor fails, return `Hold — insufficient project grounding` with a numbered list of exactly what to inspect to make the floor passable. If the external floor fails, return `Hold — external evidence unavailable`. Name the attempted surfaces and the exact evidence needed to resume. Preserve any valid partial dossiers as explicitly partial results. Done when: both floors are evaluated with pass/fail determined for each, or the exact Hold subtype is returned. 4. Compute the verdict from passing dossiers. Reason from project constraints, incumbent cost, compatibility and licensing, external maturity and activity, reversibility, and credible alternatives. Adopt a skeptic stance: state the strongest counterargument, conditions that would change the result, and a tier-sized reversal trigger (Tier 2/3 only; Tier 1 omits it). Grade the result `Adopt`, `Trial`, `Hold`, `Reject`, or `Not-our-problem`; do not overstate confidence beyond the weakest evidence leg. If conflicting evidence cannot be resolved from a primary source within the framed scope, return `Hold — conflicting evidence`. Done when: the graded result is produced with counterargument, conditions, and reversal trigger (or its Tier 1 omission is stated). 5. Output the unified verdict contract. Emit a compact chat block with these fields: Grade (the label plus its one-line plain-language meaning), Incumbent, Project evidence (verified, cited), External evidence (verified, cited), Conversation hypotheses (unverified, warm mode only), Tier, Confidence, Conditions, Reversal trigger (Tier 2/3 only), Next action. Keep Tier 1 to one screen; for Tier 2/3 cite dossiers and sources rather than reproducing them. Compute one next action from the grade: implementation planning for a clear Adopt, requirements clarification for a fuzzy Adopt, a timeboxed experiment for Trial, and no handoff for Hold, Reject, or Not-our-problem. For a mid-session second opinion, return the verdict and hand control back without prompting a follow-up. Otherwise, write an expanded local report only when requested and only to the supplied path; the chat verdict remains the required result. Done when: the verdict block is emitted with a computed next action and control is handed back, or the expanded report is written to the supplied path. ## Failure and recovery - Ambiguous frame: ask one blocking question; if no answer is available, return `Hold — frame unresolved` and make no research writes. - Scout or surface unavailable: retain successful dossiers, mark unavailable evidence explicitly, and apply the floors without substitution. If a required floor fails, return its exact Hold subtype. - Cache failure: continue from a fresh repository profile without caching. Never treat cache availability as a correctness condition or serve a profile whose freshness is unproved. - Conflicting evidence: report the conflict and return `Hold — conflicting evidence` unless the conflict can be resolved from a primary source within the framed scope. - Partial local write: remove only the run-specific scratch directory, cache entry created by this run, or optional report created by this run. Leave pre-existing cache entries and unrelated files untouched. - Non-convergence or scope widening: stop and return `Hold — non-converged`, listing the repeated conflict or newly required decision boundary. Never widen the subject, invent evidence, or claim the done predicate. ## Output Either the unified verdict block (Grade, Incumbent, Project evidence, External evidence, Conversation hypotheses, Tier, Confidence, Conditions, Reversal trigger, Next action) or an exact Hold classification with attempted evidence surfaces, retained partial results, and the evidence required to resume. The Hold subtypes are: insufficient project grounding, external evidence unavailable, unbounded selection, frame unresolved, conflicting evidence, and non-converged. Plus, when explicitly requested, one expanded report written to the supplied local path.
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.