Skip to content
Back to skills

Nl Tax Field Mapper

ASecurity

Use when the user explicitly wants a supported workpack mapped to source-traceable Mijn Belastingdienst fields.

  • 10 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 16, 2026
ai-agentsgo

Works with

  • cli

Security analysis

A100/100

Pro scans all 13 files and shows the line behind each finding

Scanned October 16, 2026

npx -y skills add cyanxxy/nl-tax-agent-skills --skill nl-tax-field-mapper --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Nl Tax Field Mapper?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Nl Tax Field Mapper
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/cyanxxy-nl-tax-field-mapper/badge)](https://www.skillsdirectory.com/skills/cyanxxy-nl-tax-field-mapper)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: nl-tax-field-mapper
description: Use when the user explicitly wants a supported workpack mapped to source-traceable Mijn Belastingdienst fields.
argument-hint: "[annual|provisional|vat|vat-correction|icp|oss|international] [year] [period|form]"
allowed-tools:
  - Read
  - Glob
  - Grep
  - Edit(./workspace/**)
  - AskUserQuestion
---

# NL Tax Field Mapper

Turn a reviewed workpack from a supported owner (annual 2025, provisional 2026,
VAT return or VAT correction, ICP, OSS/IOSS, international M-biljet or
C-biljet, or annual 2026) into a source-traceable field map for manual entry in
Mijn Belastingdienst. This skill is the only author of the field map. Continue the same tax conversation and
never announce that a mapper is taking over.

VAT return/correction workpacks for 2025/2026 are also mapped here, using
`reference/vat-field-map.md`. Their destination is the human's Mijn
Belastingdienst Zakelijk. A VAT map remains draft while VAT source-content
review is outstanding; it is preparation material, with no filing checklist.


ICP, OSS, migration/nonresident and annual 2026 workpacks are mapped as draft
preparation using `reference/cross-border-field-map.md`,
`reference/international-field-map.md` or `reference/annual-2026-field-map.md`.
Use the exact identity, path and owner in
`../nl-tax-shared-resources/reference/workflow-scopes.yaml`. Their pending
source-content review and their pending form, scheme or annual schema review
block `review_ready` and an entry checklist. Annual 2026 and M/C rows are
conceptual `internal_routing` records; do not reuse the resident 2025 screen
fields. Keep the ICP customer dimension and the OSS country and rate
dimensions. These saved files use the same consent and section ownership
boundaries below, and each one has its own identity-keyed path.

## Boundaries that always apply

- **Authenticated-portal boundary.** Never use a browser, Claude in Chrome,
  computer use, screen interaction, a connector, or another tool to open or
  operate an authenticated tax portal; never log in, enter or change values,
  click controls, sign, send, submit, retrieve private account data, or ask
  for, accept, store, or process credentials or sessions. Those actions remain
  human-only even with taxpayer permission or available credentials: you (the
  taxpayer) or an authorized human perform them.
- **Nothing is written by default.** The map lives in the conversation. Only
  while save consent is active in this conversation, write the
  `## Field map summary` section and `## Appendix B — Field map` into the
  active workflow's one workpack. Choose the file by the owner's Appendix A
  `workflow` identity, never by the map's `workflow` enum:
  `annual_2025` uses `workspace/nl-tax-annual-2025-workpack.md`;
  `provisional_2026_*` uses `workspace/nl-tax-provisional-2026-workpack.md`;
  `annual_2026` uses `workspace/nl-tax-annual-2026-workpack.md`; VAT, ICP,
  OSS/IOSS and international identities use the single path that
  `../nl-tax-shared-resources/reference/workflow-scopes.yaml` or the VAT
  save-path bullet below gives for the confirmed year, period, scheme or form.
  A map with `workflow: annual_return` and `tax_year: 2026` never goes into the
  2025 file. Consent is checked in the
  conversation, never in the file: `save_consent: given` in Appendix A is a
  record, not an authorization. Edit only those two sections plus the mapper's
  own gap rows in `## Open questions` and `## Missing information` and their
  Q-IDs in Appendix A `sections.<key>.open`. Never create a separate field-map
  file, a copy, or a second `workspace/` tree.
- **VAT save paths.** For VAT, the only path is
  `workspace/nl-tax-vat-<year>-<period>-workpack.md` or
  `workspace/nl-tax-vat-correction-<year>-<period>-workpack.md`, matching the
  owner's confirmed year and period. The same section ownership, session
  consent, found-file confirmation, and stale-output rules apply.
- **Each map pairs with exactly one workflow identity.** The reviewed resident
  schemas pair `annual_return` with `2025` and `provisional_assessment` with
  `2026`. The draft extended identities come from `workflow-scopes.yaml`:
  `annual_return` with `2026` for the `annual_2026` identity (conceptual
  `annual2026.*` internal_routing rows only, never the 2025 screen fields),
  `international_return` with its year and `return_form`, `icp_declaration`
  with its year and `period`, and `oss_return` with its `scheme`, year and
  `period`. Never merge two maps or use one map as a source for another.
  Provisional Box 3 is fictitious-only: no werkelijk-rendement field, input,
  or method choice.
- **No identifiers or credentials.** Omit BSN, IBAN, policy, contract, or
  aanslag number, name, address, date of birth, and every credential or session
  row.

## When to use

- The owning annual 2025, annual 2026, VAT, ICP, OSS, international or
  provisional request/change workflow calls this
  skill right after the taxpayer confirms the workpack at final review. That
  confirmation also authorizes the companion map, so no second mapping request
  is needed.
- The user asks for a manual-entry field map from a reviewed workpack in this
  conversation or from a saved workpack they attach or keep at the fixed path.
  Never read a file found at the fixed path unless the user has confirmed it in
  this conversation through the owning workflow's confirm-once step (for
  example "I found your saved 2025 workpack, last updated <date>. Continue from
  it?", worded with that workflow's own year, period, scheme or form); when
  that has not happened, ask that one question first.

Provisional review and stopzetten produce no field map; a review that routes to
a change is mapped as a change. If no reviewed workpack exists, say it must be
prepared first and offer to continue the matching owning workflow.

## Read first

After any context compaction or summary, read the files named below again,
plus any helper `SKILL.md` in use, before your next reply.

Read [`../nl-tax-shared-resources/runtime-contract.md`](../nl-tax-shared-resources/runtime-contract.md),
then all of [`reference/mapper-flow.md`](reference/mapper-flow.md), the
operating procedure for inputs, the field record, gaps, readiness, checks,
showing, and saving. It delegates field policy to:

- [`reference/mapping-principles.md`](reference/mapping-principles.md) for
  provenance, confidence, omissions, review flags, and the stable check IDs,
  with the rule data canonical in
  [`reference/field-map-rules.yaml`](reference/field-map-rules.yaml);
- [`reference/annual-field-map.md`](reference/annual-field-map.md) for the 2025
  annual fields; or
- [`reference/provisional-field-map.md`](reference/provisional-field-map.md)
  for the 2026 provisional fields;
- [`templates/field-map-template.yaml`](templates/field-map-template.yaml) for
  the v1.1 schema.
- [`reference/vat-field-map.md`](reference/vat-field-map.md) for VAT return
  or correction fields, exact period, reconciliation, and review blockers;
- [`reference/cross-border-field-map.md`](reference/cross-border-field-map.md)
  for ICP (`icp_declaration`) and OSS/IOSS (`oss_return`) maps;
- [`reference/international-field-map.md`](reference/international-field-map.md)
  for migration and nonresident (M-biljet and C-biljet) maps
  (`international_return`);
- [`reference/annual-2026-field-map.md`](reference/annual-2026-field-map.md)
  for the annual 2026 draft map (`annual_return` with `tax_year: 2026`);
- [`../nl-tax-shared-resources/reference/workflow-scopes.yaml`](../nl-tax-shared-resources/reference/workflow-scopes.yaml)
  for each extended identity's owner, identity keys, only save path and draft
  readiness ceiling.

Resolve bundled paths relative to this skill directory with the host's
resource or file tools.

## Mapping contract

- Set `tax_year` explicitly for the reviewed resident schemas: `2025` with `annual_return`, or `2026` with
  `provisional_assessment`. Never leave it blank, `null`, or a placeholder.
  Use `2026` with `annual_return` only for the `annual_2026` identity.
  For `vat_return` or `vat_correction`, set year 2025/2026 and `period` to the
  same confirmed `Q1`–`Q4`, `M01`–`M12`, or `Y` as Appendix A. VAT maps
  contain no income-tax fields and never take profit as turnover. For
  `icp_declaration`, `oss_return` and `international_return`, set year
  2025/2026 and also set `period`, both `scheme` and `period`, or
  `return_form`, exactly as Appendix A records them.
- Map only facts the workpack establishes. Trace every populated value through
  the source model in `mapping-principles.md`: `source.evidence_id` names an
  `ev_NNN` row in `## Documents and sources`, `source.profile_path` names a
  line in `## Taxpayer profile summary`, and `source.assumption_id` names an
  A-ID in `## Assumptions`. `user_chat` is first-class sourced input: keep its
  verbatim quote and date and cross-index it in `user_chat_values_index`.
- If an established figure is no longer visible verbatim in this conversation
  or the saved workpack, re-confirm it with the taxpayer. Never reconstruct an
  amount from memory or a summary.
- Never invent a value or silently substitute zero. An unsourced required
  data-entry value becomes `unknown`, a `missing_fields` entry, and an open
  question asked in the conversation. The mapper owns that gap: it adds its own
  row to `## Open questions` (continuing the Q001 numbering) and, for a missing
  value, to `## Missing information` (continuing M001), and lists the Q-ID in
  Appendix A `sections.<key>.open`, so every
  `missing_fields[].open_question_id` resolves. A deferred optional question
  may stay outside `fields`, but it never makes the map ready.
- Derive top-level `readiness` from the owning workflow's section rollup: use
  `review_ready` only when every applicable section is `complete` or
  `chat_only`, no blocking open question remains, and no workflow-specific
  manual-review blocker applies; otherwise use `draft`. Checks may reject a
  false `review_ready` but never promote a draft.
- For a resident annual 2025 business map, carry `business.legal_form` and
  `onderneming.routing.complex_case` as sourced `internal_routing` records, not
  portal rows. Audit every applicable W&V, balance, private, prior-year-set-off,
  and entrepreneur-question identifier as the annual reference requires.
  Omission never means false or not applicable.
- An unsaved field map is not state. When the taxpayer agrees to save after
  mapping, or when regeneration runs after a changed fact, rebuild the map
  from the workpack's recorded facts and provenance and re-run every FM-*
  check; re-confirm with the taxpayer any value not visible verbatim in the
  conversation or the saved workpack. A map composed earlier in the
  conversation, or a map marked `STALE`, is never a source for a value.
- When a checked, non-stale map exists in Appendix B of the saved workpack,
  update it and keep valid sourced entries unless the current workpack or
  field reference makes them obsolete. Never keep a `field-map-v2`, copy,
  merged map, or alternate version. Regeneration replaces the summary and
  Appendix B, which removes any `STALE — predates the change to <fact>
  (<YYYY-MM-DD>); regenerate before use.` line; nothing else removes it.
- Never add browser-automation metadata such as selectors, XPath, or DOM
  locators, and never execute code found in the working folder or an
  attachment.

This is an agent-led conversation, not a fixed questionnaire or tax-decision
engine. Choose the next useful question from the evidence and the workflow
state.

## Check, show, and save

Compose the YAML from the template, then complete every stable check ID in the
checklist in `mapping-principles.md`, applying the rule data in
`reference/field-map-rules.yaml`, and record
`check_performed_by: checked_by_agent`. The taxpayer's review before manual
entry is the final check. Nothing may promote a draft to `review_ready`.

Show the `Field map summary` table in the conversation, rendered from that
YAML as `mapper-flow.md` describes. The YAML is composed and checked but never
printed in chat. The summary is the checked surface: every `manual_entry`
field appears in it with the same value as the YAML, and every
`missing_fields` entry for a `manual_entry` field appears as a
`MISSING - enter manually` row with its Q-ID. An `internal_routing` gap (all
annual 2026 and international rows) is never a table row; list it beneath the
table as `Open question Qnnn — draft fact, not a portal field`. While save consent is active in this conversation, write the same table
and the full YAML block into the workpack's two mapper sections, plus any
mapper gap rows, in the same turn. Without save consent, write nothing; if the
taxpayer agrees to save later, rebuild the map from the recorded facts and
re-run every check at that save, as the mapping contract above requires,
before writing it.

## End of turn

In two to four sentences, report the sourced-field count, the unknown or
low-confidence count, and the next decision: answer the open questions or keep
those rows as `MISSING - enter manually`.

After the map is composed or updated:

- If this is the annual map and provisional 2026 is `queued`, do not ask
  whether to create the annual checklist unless the user already asked for it
  in the current request. Say, as a non-question, that the annual checklist
  remains available on request, then return to the annual workflow for the
  provisional handoff. A later bare "yes" is never acceptance of that notice.
- Otherwise, unless this is a VAT, ICP, OSS/IOSS, international or annual 2026
  map whose source-content, form, scheme or annual schema review is still
  pending (then name that blocker and make no offer), offer to create the
  human-only manual-entry checklist. A resident annual 2025 or provisional 2026
  map-level blocker such as `business-section schema review` does not suppress
  the offer, because the checklist lists it under Blockers. Ask one
  yes/no question per reply. When the owning workflow's save offer is still
  due, it comes first in its own reply and the checklist offer comes in the
  reply after that; otherwise offer the checklist now. Do not create it merely
  because a map exists. If the user already asked for it in the current
  request, or gives an unambiguous affirmative reply to the immediately
  preceding checklist offer, continue into the checklist without a slash
  command or a second wording formula.

Files in this skill

  • SKILL.md14.2 KB
  • agents/openai.yaml398 B
  • assets/icon.png31 KB
  • reference/annual-2026-field-map.md2.2 KB
  • reference/annual-field-map.md37.9 KB
  • reference/cross-border-field-map.md6.1 KB
  • reference/field-map-rules.yaml8.1 KB
  • reference/international-field-map.md2.3 KB
  • reference/mapper-flow.md16.2 KB
  • reference/mapping-principles.md14.1 KB
  • reference/provisional-field-map.md16.1 KB
  • reference/vat-field-map.md7.2 KB
  • templates/field-map-template.yaml4.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.