← Solibo HomeCONTENT HISTORY

Update to Solibo Home

Snapshot Oct 28, 2026 · 18:05 UTC · version 1.3.0

Collection source: downloaded plugin package.

WHAT CHANGED

Instructions updated for resident-communication

Skill instructions — Now says: A one-off selection (egendefinert utvalg), such as the owners in one entrance or the tenants on one floor, needs no tag: `search_sections` with...

Observed in instructions or declared skills. Runtime behavior has not been tested.

Save Solibo Home and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

Skill instructions

Before

Oct 28, 2026 · 12:34 UTC

No removed lines (ordering may have changed)

After

Oct 28, 2026 · 18:05 UTC

A one-off selection (egendefinert utvalg), such as the owners in one entrance or the tenants on one floor, needs no tag: `search_sections` with `companyId` and the address text (it matches the entrance letter, as in "Glomboveien...

Supporting files

Before

Oct 28, 2026 · 12:34 UTC

[{"relative_path":"references/tool-notes.md","size_in_bytes":6294}]

After

Oct 28, 2026 · 18:05 UTC

[{"relative_path":"references/tool-notes.md","size_in_bytes":6346}]

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -31,6 +31,13 @@
    sections, pass `recipientTagResidents` ["TENANTS"] or ["CO_HABITANTS"] and say that they are fixed
    recipients that do not follow later tenancy changes. The TENANTS and CO_HABITANTS groups reach the whole
    company.
+   A one-off selection (egendefinert utvalg), such as the owners in one entrance or the tenants on one floor,
+   needs no tag: `search_sections` with `companyId` and the address text (it matches the entrance letter, as
+   in "Glomboveien 2A", the apartment number and the H-number, as in "H03"; check `streetAddress` and `hNr`
+   in the results, since the search also returns near matches), then pass the ids in `recipientSectionIds`
+   on `draft_customer_message` with `recipientSectionResidents` ["OWNERS"], ["TENANTS"] and/or
+   ["CO_HABITANTS"]. Ask which resident types the user wants when they have not said. Solibo Home adds the
+   current residents as direct recipients by id, fixed once saved; use a tag when the group will be reused.
 4. People outside Solibo Home go in `directRecipients` (addresses or numbers the user supplied); registered
    people in `directRecipientPersonIds` (integers from `search_persons`), organisations in
    `directRecipientOrganizationIds`. Unknown ids are dropped silently and reported after confirmation in
Full technical diff · 2 changed fields

changed /included_files

BEFORE
[
  {
    "relative_path": "references/tool-notes.md",
    "size_in_bytes": 6294
  }
]
AFTER
[
  {
    "relative_path": "references/tool-notes.md",
    "size_in_bytes": 6346
  }
]

changed /skill_md_contents

BEFORE
"---\nname: resident-communication\ndescription: \"Send or prepare communication to the residents or board of a housing community in Solibo Home: email newsletters, SMS, feed posts, practical information, letters, and the same message to several communities. Covers choosing the audience (board, owners, tenants, custom notification groups built from section tags), previewing, saving a draft, sending now or scheduling, attachments, and delivery reports. Use when the user wants to inform, notify, write to, or publish something for residents, the board, or everyone in a company (beboere, styret, nyhetsbrev, SMS, oppslag).\"\n---\n\n# Resident communication\n\nEvery message goes preview, then approval, then one confirmation. Preview-only requests end at the\npreview. Saving a draft, sending now and scheduling are different actions; when the user has not said which,\nask before the preview.\n\n## Resolve company and audience\n\n1. Resolve the company (`search_companies`); with one company in play, `set_working_company`.\n2. Audiences are `recipientGroups`: ALL, BOARD_CHAIRS, BOARD_MEMBERS, BOARD_ALTERNATES, OWNERS, TENANTS,\n   CO_HABITANTS, EXTERNALS. \"The board\" (styret) is BOARD_CHAIRS, BOARD_MEMBERS and BOARD_ALTERNATES unless\n   the user narrows it. `get_communication_notification_groups` with `channel` EMAIL or SMS lists the\n   groups and the section tags available as custom groups; `get_sms_readiness` says whether enough SMS\n   credits exist.\n3. Custom groups (one per street, building or entrance) are section tags. To build one: `search_sections`\n   with `companyId` and the address words, then tag them all with one `add_section_tags` call (`sectionIds`\n   from the search, up to 300, and `tagNames`), one preview and one confirmation; `sectionId` still works\n   for a single section, and a new name creates the tag. Check `failedCount` and `unknownCount` in the result:\n   name any section that was not tagged, and for an UNKNOWN row read `get_section_tags_by_section` before\n   retrying, because the tag may already be set. `get_company_section_tags` lists the\n   company's tags, `get_section_tags_by_section` shows which sections carry them, `remove_section_tag`\n   removes one. To send to a group, pass the tag name in `recipientTags`. A tag reaches the current owners and\n   section contact persons of the tagged sections plus the company's contact persons, resolved at send\n   time, never tenants or co-habitants; say all three groups in the approval summary. To include tenants or\n   co-habitants of the tagged\n   sections, pass `recipientTagResidents` [\"TENANTS\"] or [\"CO_HABITANTS\"] and say that they are fixed\n   recipients that do not follow later tenancy changes. The TENANTS and CO_HABITANTS groups reach the whole\n   company.\n4. People outside Solibo Home go in `directRecipients` (addresses or numbers the user supplied); registered\n   people in `directRecipientPersonIds` (integers from `search_persons`), organisations in\n   `directRecipientOrganizationIds`. Unknown ids are dropped silently and reported after confirmation in\n   `droppedDirectRecipientPersonIds` and `droppedDirectRecipientOrganizationIds`; tell the user about every\n   dropped id in both fields, since those recipients will not receive the message.\n\n## Email or SMS to one company\n\n- `draft_customer_message` with `messageType` email or sms, `subject` (email), `content`, the audience\n  fields, and for email `htmlText`, `attachments`, `inlineDocuments` and `files`. The preview saves\n  nothing. After approval, `confirm_pending_communication` saves a draft and returns `newsletterId` or\n  `broadcastId`.\n- To schedule, set `scheduledAt` to a full timestamp with an offset (\"2026-11-04T09:00:00+01:00\") on the\n  draft; the saved draft has status scheduled and nothing more is needed. A past value is treated as\n  \"send now\" intent, so ask instead of guessing.\n- To send a saved draft now: `send_customer_message` with `messageType` and `messageId` (the id from the\n  save result), preview, then `confirm_pending_communication`. Irreversible; never reuse the save\n  `previewId` to send.\n- To change a draft: `update_email_newsletter_draft` or `update_sms_broadcast_draft` (omitted fields are\n  kept; `scheduledAt` or `clearSchedule`, not both). `get_email_newsletter`, `get_sms_broadcast` and\n  `search_newsletters_and_sms_broadcasts` (`type` EMAIL or SMS, `published`) find earlier messages.\n- Delivery: `get_communication_report` for counts, `get_communication_delivery_report` with `filter`\n  PROBLEM for bounces and failures. A sent status does not mean every resident has read the message.\n\n## The same email to several companies\n\n`prepare_batch_newsletter` with `companyIds` (1 to 100), `subjectTemplate` and `contentTemplate` (placeholders\nsuch as {{company.name}}) renders every company's message without saving; when `readyForDrafting` is true,\nits `previewId` is the frozen company set. After approval, `draft_batch_newsletter` with that `previewId`\n(and `scheduledAt` for a future send) creates the drafts after `confirm_pending_communication`; its result\nholds `batchDraftId`. `publish_batch_newsletter` with the `batchDraftId` sends them all after a second\nconfirmation. Never rebuild the company list after a complete preview, and never loop\n`send_customer_message` over the drafts.\n\n## Feed posts and practical information\n\n- `create_feed_post` (`title`, `content`; `notifyEmailGroups`, `notifySmsGroups`; `pinned`; `image`,\n  `attachments`, `inlineDocuments`, `files`) and `create_practical_info` for one company; both confirm with\n  `confirm_pending_communication`. A feed post without `publishedAt` publishes on confirmation; a future\n  `publishedAt` schedules it; `draft` true saves it unpublished. Practical information publishes on\n  confirmation unless `draft` is true. `validate_homepage_sms` checks SMS credits for the chosen groups.\n- `get_homepage` and `list_homepage_posts` (`postKind` FEED or PRACTICAL_INFORMATION) give `postId` and\n  `practicalInfoId` for `update_feed_post` and `update_practical_info`; editing a published post notifies\n  nobody unless `notifyAgain` is true.\n- For several companies, `create_feed_posts_for_companies` or `create_practical_info_for_companies` with\n  `companyIds`, `titleTemplate` and `contentTemplate`, one preview and one `confirm_pending_write`. Do not\n  loop the single-company tools.\n\n## Letters and attachments\n\n- `send_company_letter` posts a physical letter (`fullName`, `addressLineOne`, `postalArea`, `city`,\n  `content`; `personId` for a registered person); real delivery, communication confirm. Never include a\n  national identity number.\n- Attach files on the message tool itself: `files[]` items carry file_id and download_url (a ChatGPT\n  attachment or a public HTTPS link), `attachments[]` items refer to a `fileId` or a `sourceDocumentId`\n  from `search_documents`, `inlineDocuments[]` items name a `slot` placed as {{inline:slot}} in `htmlText`\n  or `content`. SMS takes no documents; newsletters take no `image`. A separate `upload_document` is not\n  needed to attach a file. Never resend files, bytes or text on the confirmation hop.\n\n## Guardrails\n\n- Do not put personal email addresses, phone numbers, national identity numbers or registered addresses\n  into message text unless the user wrote them.\n- Ask for the company, audience, content and timing that are missing before the preview; do not invent\n  dates, times or sender names.\n- Report \"saved\" or \"sent\" only from an executed confirmation; a dry run or a denial changed nothing.\n\n`references/tool-notes.md` lists the arguments and result fields of every tool named here.\n"
AFTER
"---\nname: resident-communication\ndescription: \"Send or prepare communication to the residents or board of a housing community in Solibo Home: email newsletters, SMS, feed posts, practical information, letters, and the same message to several communities. Covers choosing the audience (board, owners, tenants, custom notification groups built from section tags), previewing, saving a draft, sending now or scheduling, attachments, and delivery reports. Use when the user wants to inform, notify, write to, or publish something for residents, the board, or everyone in a company (beboere, styret, nyhetsbrev, SMS, oppslag).\"\n---\n\n# Resident communication\n\nEvery message goes preview, then approval, then one confirmation. Preview-only requests end at the\npreview. Saving a draft, sending now and scheduling are different actions; when the user has not said which,\nask before the preview.\n\n## Resolve company and audience\n\n1. Resolve the company (`search_companies`); with one company in play, `set_working_company`.\n2. Audiences are `recipientGroups`: ALL, BOARD_CHAIRS, BOARD_MEMBERS, BOARD_ALTERNATES, OWNERS, TENANTS,\n   CO_HABITANTS, EXTERNALS. \"The board\" (styret) is BOARD_CHAIRS, BOARD_MEMBERS and BOARD_ALTERNATES unless\n   the user narrows it. `get_communication_notification_groups` with `channel` EMAIL or SMS lists the\n   groups and the section tags available as custom groups; `get_sms_readiness` says whether enough SMS\n   credits exist.\n3. Custom groups (one per street, building or entrance) are section tags. To build one: `search_sections`\n   with `companyId` and the address words, then tag them all with one `add_section_tags` call (`sectionIds`\n   from the search, up to 300, and `tagNames`), one preview and one confirmation; `sectionId` still works\n   for a single section, and a new name creates the tag. Check `failedCount` and `unknownCount` in the result:\n   name any section that was not tagged, and for an UNKNOWN row read `get_section_tags_by_section` before\n   retrying, because the tag may already be set. `get_company_section_tags` lists the\n   company's tags, `get_section_tags_by_section` shows which sections carry them, `remove_section_tag`\n   removes one. To send to a group, pass the tag name in `recipientTags`. A tag reaches the current owners and\n   section contact persons of the tagged sections plus the company's contact persons, resolved at send\n   time, never tenants or co-habitants; say all three groups in the approval summary. To include tenants or\n   co-habitants of the tagged\n   sections, pass `recipientTagResidents` [\"TENANTS\"] or [\"CO_HABITANTS\"] and say that they are fixed\n   recipients that do not follow later tenancy changes. The TENANTS and CO_HABITANTS groups reach the whole\n   company.\n   A one-off selection (egendefinert utvalg), such as the owners in one entrance or the tenants on one floor,\n   needs no tag: `search_sections` with `companyId` and the address text (it matches the entrance letter, as\n   in \"Glomboveien 2A\", the apartment number and the H-number, as in \"H03\"; check `streetAddress` and `hNr`\n   in the results, since the search also returns near matches), then pass the ids in `recipientSectionIds`\n   on `draft_customer_message` with `recipientSectionResidents` [\"OWNERS\"], [\"TENANTS\"] and/or\n   [\"CO_HABITANTS\"]. Ask which resident types the user wants when they have not said. Solibo Home adds the\n   current residents as direct recipients by id, fixed once saved; use a tag when the group will be reused.\n4. People outside Solibo Home go in `directRecipients` (addresses or numbers the user supplied); registered\n   people in `directRecipientPersonIds` (integers from `search_persons`), organisations in\n   `directRecipientOrganizationIds`. Unknown ids are dropped silently and reported after confirmation in\n   `droppedDirectRecipientPersonIds` and `droppedDirectRecipientOrganizationIds`; tell the user about every\n   dropped id in both fields, since those recipients will not receive the message.\n\n## Email or SMS to one company\n\n- `draft_customer_message` with `messageType` email or sms, `subject` (email), `content`, the audience\n  fields, and for email `htmlText`, `attachments`, `inlineDocuments` and `files`. The preview saves\n  nothing. After approval, `confirm_pending_communication` saves a draft and returns `newsletterId` or\n  `broadcastId`.\n- To schedule, set `scheduledAt` to a full timestamp with an offset (\"2026-11-04T09:00:00+01:00\") on the\n  draft; the saved draft has status scheduled and nothing more is needed. A past value is treated as\n  \"send now\" intent, so ask instead of guessing.\n- To send a saved draft now: `send_customer_message` with `messageType` and `messageId` (the id from the\n  save result), preview, then `confirm_pending_communication`. Irreversible; never reuse the save\n  `previewId` to send.\n- To change a draft: `update_email_newsletter_draft` or `update_sms_broadcast_draft` (omitted fields are\n  kept; `scheduledAt` or `clearSchedule`, not both). `get_email_newsletter`, `get_sms_broadcast` and\n  `search_newsletters_and_sms_broadcasts` (`type` EMAIL or SMS, `published`) find earlier messages.\n- Delivery: `get_communication_report` for counts, `get_communication_delivery_report` with `filter`\n  PROBLEM for bounces and failures. A sent status does not mean every resident has read the message.\n\n## The same email to several companies\n\n`prepare_batch_newsletter` with `companyIds` (1 to 100), `subjectTemplate` and `contentTemplate` (placeholders\nsuch as {{company.name}}) renders every company's message without saving; when `readyForDrafting` is true,\nits `previewId` is the frozen company set. After approval, `draft_batch_newsletter` with that `previewId`\n(and `scheduledAt` for a future send) creates the drafts after `confirm_pending_communication`; its result\nholds `batchDraftId`. `publish_batch_newsletter` with the `batchDraftId` sends them all after a second\nconfirmation. Never rebuild the company list after a complete preview, and never loop\n`send_customer_message` over the drafts.\n\n## Feed posts and practical information\n\n- `create_feed_post` (`title`, `content`; `notifyEmailGroups`, `notifySmsGroups`; `pinned`; `image`,\n  `attachments`, `inlineDocuments`, `files`) and `create_practical_info` for one company; both confirm with\n  `confirm_pending_communication`. A feed post without `publishedAt` publishes on confirmation; a future\n  `publishedAt` schedules it; `draft` true saves it unpublished. Practical information publishes on\n  confirmation unless `draft` is true. `validate_homepage_sms` checks SMS credits for the chosen groups.\n- `get_homepage` and `list_homepage_posts` (`postKind` FEED or PRACTICAL_INFORMATION) give `postId` and\n  `practicalInfoId` for `update_feed_post` and `update_practical_info`; editing a published post notifies\n  nobody unless `notifyAgain` is true.\n- For several companies, `create_feed_posts_for_companies` or `create_practical_info_for_companies` with\n  `companyIds`, `titleTemplate` and `contentTemplate`, one preview and one `confirm_pending_write`. Do not\n  loop the single-company tools.\n\n## Letters and attachments\n\n- `send_company_letter` posts a physical letter (`fullName`, `addressLineOne`, `postalArea`, `city`,\n  `content`; `personId` for a registered person); real delivery, communication confirm. Never include a\n  national identity number.\n- Attach files on the message tool itself: `files[]` items carry file_id and download_url (a ChatGPT\n  attachment or a public HTTPS link), `attachments[]` items refer to a `fileId` or a `sourceDocumentId`\n  from `search_documents`, `inlineDocuments[]` items name a `slot` placed as {{inline:slot}} in `htmlText`\n  or `content`. SMS takes no documents; newsletters take no `image`. A separate `upload_document` is not\n  needed to attach a file. Never resend files, bytes or text on the confirmation hop.\n\n## Guardrails\n\n- Do not put personal email addresses, phone numbers, national identity numbers or registered addresses\n  into message text unless the user wrote them.\n- Ask for the company, audience, content and timing that are missing before the preview; do not invent\n  dates, times or sender names.\n- Report \"saved\" or \"sent\" only from an executed confirmation; a dry run or a denial changed nothing.\n\n`references/tool-notes.md` lists the arguments and result fields of every tool named here.\n"
Full snapshot data
{
  "description": "Send or prepare communication to the residents or board of a housing community in Solibo Home: email newsletters, SMS, feed posts, practical information, letters, and the same message to several communities. Covers choosing the audience (board, owners, tenants, custom notification groups built from section tags), previewing, saving a draft, sending now or scheduling, attachments, and delivery reports. Use when the user wants to inform, notify, write to, or publish something for residents, the board, or everyone in a company (beboere, styret, nyhetsbrev, SMS, oppslag).",
  "included_files": [
    {
      "relative_path": "references/tool-notes.md",
      "size_in_bytes": 6346
    }
  ],
  "name": "resident-communication",
  "skill_md_contents": "---\nname: resident-communication\ndescription: \"Send or prepare communication to the residents or board of a housing community in Solibo Home: email newsletters, SMS, feed posts, practical information, letters, and the same message to several communities. Covers choosing the audience (board, owners, tenants, custom notification groups built from section tags), previewing, saving a draft, sending now or scheduling, attachments, and delivery reports. Use when the user wants to inform, notify, write to, or publish something for residents, the board, or everyone in a company (beboere, styret, nyhetsbrev, SMS, oppslag).\"\n---\n\n# Resident communication\n\nEvery message goes preview, then approval, then one confirmation. Preview-only requests end at the\npreview. Saving a draft, sending now and scheduling are different actions; when the user has not said which,\nask before the preview.\n\n## Resolve company and audience\n\n1. Resolve the company (`search_companies`); with one company in play, `set_working_company`.\n2. Audiences are `recipientGroups`: ALL, BOARD_CHAIRS, BOARD_MEMBERS, BOARD_ALTERNATES, OWNERS, TENANTS,\n   CO_HABITANTS, EXTERNALS. \"The board\" (styret) is BOARD_CHAIRS, BOARD_MEMBERS and BOARD_ALTERNATES unless\n   the user narrows it. `get_communication_notification_groups` with `channel` EMAIL or SMS lists the\n   groups and the section tags available as custom groups; `get_sms_readiness` says whether enough SMS\n   credits exist.\n3. Custom groups (one per street, building or entrance) are section tags. To build one: `search_sections`\n   with `companyId` and the address words, then tag them all with one `add_section_tags` call (`sectionIds`\n   from the search, up to 300, and `tagNames`), one preview and one confirmation; `sectionId` still works\n   for a single section, and a new name creates the tag. Check `failedCount` and `unknownCount` in the result:\n   name any section that was not tagged, and for an UNKNOWN row read `get_section_tags_by_section` before\n   retrying, because the tag may already be set. `get_company_section_tags` lists the\n   company's tags, `get_section_tags_by_section` shows which sections carry them, `remove_section_tag`\n   removes one. To send to a group, pass the tag name in `recipientTags`. A tag reaches the current owners and\n   section contact persons of the tagged sections plus the company's contact persons, resolved at send\n   time, never tenants or co-habitants; say all three groups in the approval summary. To include tenants or\n   co-habitants of the tagged\n   sections, pass `recipientTagResidents` [\"TENANTS\"] or [\"CO_HABITANTS\"] and say that they are fixed\n   recipients that do not follow later tenancy changes. The TENANTS and CO_HABITANTS groups reach the whole\n   company.\n   A one-off selection (egendefinert utvalg), such as the owners in one entrance or the tenants on one floor,\n   needs no tag: `search_sections` with `companyId` and the address text (it matches the entrance letter, as\n   in \"Glomboveien 2A\", the apartment number and the H-number, as in \"H03\"; check `streetAddress` and `hNr`\n   in the results, since the search also returns near matches), then pass the ids in `recipientSectionIds`\n   on `draft_customer_message` with `recipientSectionResidents` [\"OWNERS\"], [\"TENANTS\"] and/or\n   [\"CO_HABITANTS\"]. Ask which resident types the user wants when they have not said. Solibo Home adds the\n   current residents as direct recipients by id, fixed once saved; use a tag when the group will be reused.\n4. People outside Solibo Home go in `directRecipients` (addresses or numbers the user supplied); registered\n   people in `directRecipientPersonIds` (integers from `search_persons`), organisations in\n   `directRecipientOrganizationIds`. Unknown ids are dropped silently and reported after confirmation in\n   `droppedDirectRecipientPersonIds` and `droppedDirectRecipientOrganizationIds`; tell the user about every\n   dropped id in both fields, since those recipients will not receive the message.\n\n## Email or SMS to one company\n\n- `draft_customer_message` with `messageType` email or sms, `subject` (email), `content`, the audience\n  fields, and for email `htmlText`, `attachments`, `inlineDocuments` and `files`. The preview saves\n  nothing. After approval, `confirm_pending_communication` saves a draft and returns `newsletterId` or\n  `broadcastId`.\n- To schedule, set `scheduledAt` to a full timestamp with an offset (\"2026-11-04T09:00:00+01:00\") on the\n  draft; the saved draft has status scheduled and nothing more is needed. A past value is treated as\n  \"send now\" intent, so ask instead of guessing.\n- To send a saved draft now: `send_customer_message` with `messageType` and `messageId` (the id from the\n  save result), preview, then `confirm_pending_communication`. Irreversible; never reuse the save\n  `previewId` to send.\n- To change a draft: `update_email_newsletter_draft` or `update_sms_broadcast_draft` (omitted fields are\n  kept; `scheduledAt` or `clearSchedule`, not both). `get_email_newsletter`, `get_sms_broadcast` and\n  `search_newsletters_and_sms_broadcasts` (`type` EMAIL or SMS, `published`) find earlier messages.\n- Delivery: `get_communication_report` for counts, `get_communication_delivery_report` with `filter`\n  PROBLEM for bounces and failures. A sent status does not mean every resident has read the message.\n\n## The same email to several companies\n\n`prepare_batch_newsletter` with `companyIds` (1 to 100), `subjectTemplate` and `contentTemplate` (placeholders\nsuch as {{company.name}}) renders every company's message without saving; when `readyForDrafting` is true,\nits `previewId` is the frozen company set. After approval, `draft_batch_newsletter` with that `previewId`\n(and `scheduledAt` for a future send) creates the drafts after `confirm_pending_communication`; its result\nholds `batchDraftId`. `publish_batch_newsletter` with the `batchDraftId` sends them all after a second\nconfirmation. Never rebuild the company list after a complete preview, and never loop\n`send_customer_message` over the drafts.\n\n## Feed posts and practical information\n\n- `create_feed_post` (`title`, `content`; `notifyEmailGroups`, `notifySmsGroups`; `pinned`; `image`,\n  `attachments`, `inlineDocuments`, `files`) and `create_practical_info` for one company; both confirm with\n  `confirm_pending_communication`. A feed post without `publishedAt` publishes on confirmation; a future\n  `publishedAt` schedules it; `draft` true saves it unpublished. Practical information publishes on\n  confirmation unless `draft` is true. `validate_homepage_sms` checks SMS credits for the chosen groups.\n- `get_homepage` and `list_homepage_posts` (`postKind` FEED or PRACTICAL_INFORMATION) give `postId` and\n  `practicalInfoId` for `update_feed_post` and `update_practical_info`; editing a published post notifies\n  nobody unless `notifyAgain` is true.\n- For several companies, `create_feed_posts_for_companies` or `create_practical_info_for_companies` with\n  `companyIds`, `titleTemplate` and `contentTemplate`, one preview and one `confirm_pending_write`. Do not\n  loop the single-company tools.\n\n## Letters and attachments\n\n- `send_company_letter` posts a physical letter (`fullName`, `addressLineOne`, `postalArea`, `city`,\n  `content`; `personId` for a registered person); real delivery, communication confirm. Never include a\n  national identity number.\n- Attach files on the message tool itself: `files[]` items carry file_id and download_url (a ChatGPT\n  attachment or a public HTTPS link), `attachments[]` items refer to a `fileId` or a `sourceDocumentId`\n  from `search_documents`, `inlineDocuments[]` items name a `slot` placed as {{inline:slot}} in `htmlText`\n  or `content`. SMS takes no documents; newsletters take no `image`. A separate `upload_document` is not\n  needed to attach a file. Never resend files, bytes or text on the confirmation hop.\n\n## Guardrails\n\n- Do not put personal email addresses, phone numbers, national identity numbers or registered addresses\n  into message text unless the user wrote them.\n- Ask for the company, audience, content and timing that are missing before the preview; do not invent\n  dates, times or sender names.\n- Report \"saved\" or \"sent\" only from an executed confirmation; a dry run or a denial changed nothing.\n\n`references/tool-notes.md` lists the arguments and result fields of every tool named here.\n"
}

SHA-256 of public snapshot: 40b2554a00c7c728ca35b79e54c10c2f3cbae81587aedc87c0bba77d7b992bf2