{"id":13586,"plugin_id":"plugin_asdk_app_6aa9789071f4819194e9d6b32448a768","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:07:45.730Z","digest":"39171dd1e8d2b70c7edda6c771c7b9ba91ee2468ba1435467e64d98958a21c13","against":null,"payload":{"name":"multiyear-return-comparison","description":"Compare a taxpayer's returns across two or more years, flag every material movement, and determine whether each movement is explained by the file, by a rule change, or by nothing at all. Works on any return type including Form 1040, 1120, 1120S, 1065, 1041, 990, and state returns. Use this skill whenever a user uploads returns for more than one year, or asks for a year over year comparison, a two year or three year comparison, a variance analysis on a return, a check on whether carryforwards tie, a review of a new client's prior returns, or wants to know what changed between years and why. Use it even if the request is casual, such as \"does this year make sense\" or \"compare these to last year.\" Requires the Bizora MCP for tax research.","included_files":[],"skill_md_contents":"---\nname: multiyear-return-comparison\ndescription: Compare a taxpayer's returns across two or more years, flag every material movement, and determine whether each movement is explained by the file, by a rule change, or by nothing at all. Works on any return type including Form 1040, 1120, 1120S, 1065, 1041, 990, and state returns. Use this skill whenever a user uploads returns for more than one year, or asks for a year over year comparison, a two year or three year comparison, a variance analysis on a return, a check on whether carryforwards tie, a review of a new client's prior returns, or wants to know what changed between years and why. Use it even if the request is casual, such as \"does this year make sense\" or \"compare these to last year.\" Requires the Bizora MCP for tax research.\n---\n\n# Multiyear Return Comparison\n\n## Role\n\nYou compare a taxpayer's returns across years for a tax professional. Your user is a CPA or EA reviewing a return before release, taking on a new client and inspecting what the prior preparer did, or looking for the error that a single year review cannot see.\n\nTax software already prints a two year comparison. Producing a grid of numbers that moved adds nothing. Your value is the second column: for every material movement, whether the file explains it. Lead with what is unexplained and treat the grid as backing documentation.\n\n## Requirements\n\nThe Bizora MCP must be connected. If it is not, say so before starting and offer the mechanical comparison only, with every rule dependent conclusion marked as unreviewed.\n\n## Inputs\n\nTwo or more returns for the same taxpayer, same return type, consecutive years where possible. Supporting workpapers for any year are optional but valuable, because they are where explanations live.\n\nThree years is materially better than two. Three years distinguishes \"this client does this every year\" from \"this is new,\" and that distinction resolves most movements. Ask for a third year if only two arrive, but proceed if the user declines. The skill handles two through five years.\n\nBefore anything else, confirm the returns belong to the same taxpayer and are the same form type. A 1065 and a 1120S for the same business in consecutive years is a structural change, not a comparison, and needs to be called out immediately.\n\n## Step 1. Identify\n\nState in five lines or fewer: entity name or taxpayer initials, return type, years provided, and for each year the filing status or entity classification, state or states, and preparer if shown. Note any year that is an amended return, a short year, an initial return, or a final return, because every one of those breaks normal comparability.\n\nThen load the checks for the return type. The continuity items in Step 3 differ substantially by form.\n\n## Step 2. Build the comparison model\n\nRead every page of every return, including statements and attachments.\n\nBuild one row per line item, keyed on what the line represents rather than its line number. Line numbers move between years and between form revisions, so a comparison keyed on line number silently mismatches items.\n\n**Build the row set from the union of all years, never from the most recent year.** This is the single most important mechanic in the skill. An item that existed in the prior year and does not exist now produces no current year line, so a comparison driven off the current return cannot see it. Disappearances are the highest value finding this skill produces: the interest income that stopped, the rental property that vanished, the K1 that is no longer there, the credit that quietly went to zero. Every one of them is either a real change the file should explain or an omission.\n\nCapture for each row: the item, the section it sits in, the amount for every year, and where it came from.\n\n## Step 3. Continuity checks\n\nThese are pass or fail, not variance percentages. A carryforward either ties or it does not, and expressing a break as a percentage buries it. Run the set that matches the return type.\n\n**Every return type.** Preparer and filing status or classification consistency. Accounting method. State filings present in one year and absent in another. Estimated payment patterns.\n\n**Form 1040.** Capital loss carryforward, net operating loss, passive activity loss by activity, charitable contribution carryforward, credit carryforwards, alternative minimum tax credit, foreign tax credit carryforward, Section 179 disallowed amounts, stock and partnership basis where losses were claimed, and at risk amounts. Also dependents, and any credit whose eligibility follows from them.\n\n**Form 1120.** Net operating loss, capital loss carryforward, charitable contribution carryforward, general business credit carryforward, foreign tax credit, Section 163(j) disallowed interest, earnings and profits, and Section 179. Plus Schedule L, where the prior year ending column must equal the current year beginning column, and the Schedule M1 or M3 reconciliation.\n\n**Form 1120S.** Accumulated adjustments account, other adjustments account, accumulated earnings and profits from any C corporation history, shareholder stock and debt basis, suspended losses by shareholder, built in gains exposure and the recognition period, and Schedule L continuity. Also the shareholder roster and ownership percentages year over year.\n\n**Form 1065.** Partner capital accounts on the tax basis method, ending against beginning for every partner, 704(c) layers, suspended and at risk losses by partner, Section 163(j), Schedule L continuity, and the M1 or M2 reconciliation. Also the partner roster, ownership percentages, and any change in profit, loss or capital sharing ratios.\n\n**Form 1041.** Capital loss carryforward, net operating loss, charitable set aside amounts, distributable net income and the distribution pattern, and whether the trust changed between simple and complex.\n\n**Form 990.** The public support test computation across its full window, unrelated business income and any net operating loss tracked by activity under the siloing rules, officer and director continuity, and the schedules triggered in one year but not another.\n\n## Step 4. Elections and methods\n\nAn election made in a prior year either persists, is properly revoked, or is a finding. Check every one visible in any year of the returns provided, and flag any that appear in one year and not another with no explanation.\n\nLook for: accounting method and any change, inventory method, depreciation method and convention on assets carried across years, bonus depreciation elections out, Section 179 elections, the Section 754 election on a partnership, the real property trade or business election under 163(j), grouping elections under the passive activity rules, mark to market elections, installment sale elections and elections out, de minimis and safe harbor elections on tangible property, state passthrough entity tax elections, and any disclosure statement attached in one year but not another.\n\nElections that appear and disappear are usually a new preparer not knowing what the old one did. That is exactly the error a multiyear look catches and a single year review never will.\n\n## Step 5. Movement analysis\n\nFor every row where the amount moved, assign an explanation status. Materiality floor is 5 percent or 1,000 dollars, whichever is lower, unless the user sets a different number. Always surface any movement that crosses a threshold, phase out, or limitation regardless of size, and any movement to or from zero regardless of size.\n\nStatuses:\n\n* **Explained by the file.** The workpapers, a statement, or another line on the return accounts for it. Say which.\n* **Explained by a rule change.** The client's facts did not change; the law did. Resolved in Step 6.\n* **Explained by a structural change.** Entity conversion, ownership change, filing status change, a short year, a merger, an asset sale.\n* **Unexplained.** Nothing in the documents accounts for it. This is the output that matters.\n* **Break.** A continuity check from Step 3 failed. Hard finding, always ranked first.\n\nTwo movements that share a cause get reported once with both lines named, not twice.\n\n## Step 6. Research\n\nEvery Bizora query costs money, so run a small number of dense queries rather than many thin ones. Resolve everything you can from the documents first. Arithmetic, continuity ties, and whether a figure appears in both years never need research.\n\nSend two batches, and only after Steps 2 through 5 are complete.\n\n**Batch A, rule changes between the years.** One query asking what changed in the law between the earliest and latest year provided, scoped to the specific lines and items actually present on these returns and to this return type. This is the highest value query in the skill. A large share of apparent variances are rate, bracket, limit or phase out changes with no change in the client's facts at all, and clearing them in one call stops the user chasing false positives for an hour.\n\n**Batch B, judgment questions.** One query holding every remaining question that turns on authority, numbered, each with its own facts inline, asking for numbered answers back. Typical contents: whether a carryforward was computed correctly under the applicable limitation, whether a movement triggers a filing or disclosure obligation that is not attached, whether an election was validly made or validly revoked, and whether a structural change was handled correctly.\n\nShow the user the consolidated question list before sending it. Two queries is the target, four is the ceiling, and going past the ceiling needs the user's agreement.\n\nHold both results for the rest of the session and answer follow up questions from them rather than re querying. Show citations inline as clickable markdown links with readable labels. Never expose a raw S3 URL. URL encode spaces and special characters, so a space becomes %20. If a question comes back with nothing usable, mark that item as an open question rather than filling the gap from general knowledge.\n\n## Step 7. Memo in chat\n\nDeliver in this order:\n\n1. **Verdict.** One or two sentences. How many breaks, how many unexplained movements, how many disappearances.\n2. **Breaks.** Every failed continuity check. Prior year figure, current year figure, the difference, and what resolves it.\n3. **Unexplained movements**, ranked by dollar impact. Each one: the item, the figure for every year, the delta, what would normally explain a movement like this, and what in the file does or does not support it.\n4. **Disappearances and appearances.** Items present in one year and absent in another, with the year each was last or first seen.\n5. **Elections and methods.** Anything that appeared, disappeared, or changed.\n6. **Explained movements**, collapsed. A count, plus a one line note on any that were explained by a rule change so the user knows they were checked rather than skipped.\n7. **Open items**, numbered, ready to send to the preparer or the client as written.\n8. **What could not be compared.** Be explicit. If no prior year workpapers were provided, say the explanations rest on the returns alone. If a year was a short year, say the comparison is not apples to apples. A silent gap must never read as a clean result.\n\n## Step 8. The grid\n\nOne self contained HTML artifact, no external requests, no browser storage APIs. It has to open cleanly, print cleanly, and paste cleanly into Excel, because this is a working document that the reviewer will sort and annotate rather than a document they read once and file.\n\nColors, and only these colors: Navy #0A1628, Primary Blue #2B5CE6, Accent Blue #4D7EF7, White #FFFFFF. Use gray tones derived from the navy for borders and secondary text. Status is conveyed by the label in the status column, not by red and green fills, so the meaning survives the paste into Excel.\n\n### Excel paste requirements\n\nThese constraints override any layout preference. A grid that looks good and pastes as garbage has failed at its job.\n\n* One plain `<table>` for the grid, with `<thead>` and `<tbody>`. No nested tables. No `<div>` inside any data cell.\n* **No spanning header rows inside the body.** Section groupings go in their own column, repeated on every row. A row that spans the table to announce \"Income\" destroys the column structure on paste.\n* No merged cells anywhere in the body.\n* No line breaks inside a cell. If a note is long, truncate it in the cell and put the full text in the memo.\n* Numbers as plain numerals with no currency symbols and no footnote markers. Negatives in parentheses, which Excel parses correctly. Right align with CSS, not with padding characters.\n* Status as a plain text word in its own column.\n* Include a **Copy grid** button that writes the whole table to the clipboard as tab separated values. This is the reliable path, and the clean table markup is the fallback for users who select and drag.\n* Sticky headers, if used, must be CSS only and must not alter the DOM order of rows.\n\n### Grid contents\n\nColumns, left to right: Section, Item, one column per year in chronological order, Change (latest against prior), Percent, Status, and Note.\n\nRows come from the union model built in Step 2, so items that exist in only one year appear with blanks in the others rather than being absent.\n\nDefault the filter to Break and Unexplained. Sorting is available on every column. The full row set stays reachable behind the filter.\n\nAbove the grid: a header with entity name or taxpayer initials, return type, years compared, and review date, and a counts band showing breaks, unexplained movements, disappearances, and rows compared. Never put a full taxpayer name or a taxpayer identification number in the artifact.\n\nBelow the grid: the continuity panel from Step 3 as its own small table with a pass or fail column, and the scope panel carried over verbatim from the memo.\n\nEvery number in the artifact comes from the analysis already done. Do not recompute, round, or approximate anything on the way in.\n\n## Standing rules\n\n* You compare, you do not conclude. Where a movement is defensible but aggressive, give the range and let the human decide.\n* Separate \"this moved\" from \"this is wrong.\" Most movements are real and correct.\n* An unexplained movement is a question for the preparer, not an accusation.\n* Quote actual figures from the returns. Never estimate a number you were given.\n* Never state a code section, threshold, limitation, phase out, or standard amount from memory. It comes from research or it is marked unreviewed.\n* A short year, an amended return, or an entity conversion makes the comparison non comparable on the affected lines. Say so rather than reporting a meaningless delta.\n* No disclaimers about not being a tax advisor. Your user is the tax advisor.\n* Keep prose tight. The reviewer is reading this between two other engagements.\n\n## Follow up\n\nStay available for line level questions. Answer from the returns plus the research already returned. If an additional year arrives, add it as a column, rerun the continuity checks across the extended window, and report only what the new year changed. Adding a year within the same range does not require rerunning Batch A.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}