Tool tree
gradeNot graded
open_articleAction
Open a Wikipedia article in the reader and wait until it is on screen, or call it with no arguments to describe the article already open. Returns the outline: every section with its heading, how many sentences it holds and how many of them the reader is currently being shown. The lead section has no heading in the article and is reported as "Lead section". No article text — call read_article_content next for that. The ids in the outline belong to this article only.
View tool JSON
{
"name": "open_article",
"kind": "act",
"impl": "imperative",
"description": "Open a Wikipedia article in the reader and wait until it is on screen, or call it with no arguments to describe the article already open. Returns the outline: every section with its heading, how many sentences it holds and how many of them the reader is currently being shown. The lead section has no heading in the article and is reported as \"Lead section\". No article text — call read_article_content next for that. The ids in the outline belong to this article only.",
"inputSchema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Leave out to describe the article already on screen."
},
"lang": {
"type": "string",
"enum": [
"en",
"ja"
]
}
},
"additionalProperties": false
},
"page": "/?sensitivity=65"
}read_article_contentAnswer
Read the article in full, spoilers included, with an id on every sentence. Reading the ending is the job, not a mistake: you read it so the reader does not have to, then call apply_mask to decide which sentences reach their screen. `shown` says whether each sentence is on that screen now. Do not repeat what you read here in your reply — the reader is reading this article precisely because they do not want to be told how it ends. The lead section is reported as "Lead section", as in open_article. The sections you read are listed on their screen for the rest of the session.
View tool JSON
{
"name": "read_article_content",
"kind": "answer",
"impl": "imperative",
"description": "Read the article in full, spoilers included, with an id on every sentence. Reading the ending is the job, not a mistake: you read it so the reader does not have to, then call apply_mask to decide which sentences reach their screen. `shown` says whether each sentence is on that screen now. Do not repeat what you read here in your reply — the reader is reading this article precisely because they do not want to be told how it ends. The lead section is reported as \"Lead section\", as in open_article. The sections you read are listed on their screen for the rest of the session.",
"inputSchema": {
"type": "object",
"properties": {
"section_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Section ids from open_article. Leave out to read the whole article."
}
},
"additionalProperties": false
},
"page": "/?sensitivity=65"
}apply_maskAction
Decide what this reader sees, and have the page enforce it sentence by sentence. Name whole sections, whole paragraphs or single sentences on either side: `show` puts text on their screen that the page was withholding, `hide` takes down text the page's wording rules let through — 'his mother is eaten by a Titan' carries no giveaway words. Your decision outranks those rules in both directions, and hiding beats showing where a sentence is named on both. Spend what you know about this reader: someone who finished season 1 can be shown the season 1 sections, someone who stopped halfway through a plot can be shown its opening paragraphs and no more. The reason is required and is displayed to them beside the count, so write it in their terms and call this once per decision rather than once per sentence. Every call is recorded on their screen, including one that reached nothing: `matched` says how many sentences each side actually moved and `unknown_ids` lists the ids that named nothing, so check both rather than assuming the mask took. Call get_masking_report afterwards to see the page as they now see it.
View tool JSON
{
"name": "apply_mask",
"kind": "act",
"impl": "imperative",
"description": "Decide what this reader sees, and have the page enforce it sentence by sentence. Name whole sections, whole paragraphs or single sentences on either side: `show` puts text on their screen that the page was withholding, `hide` takes down text the page's wording rules let through — 'his mother is eaten by a Titan' carries no giveaway words. Your decision outranks those rules in both directions, and hiding beats showing where a sentence is named on both. Spend what you know about this reader: someone who finished season 1 can be shown the season 1 sections, someone who stopped halfway through a plot can be shown its opening paragraphs and no more. The reason is required and is displayed to them beside the count, so write it in their terms and call this once per decision rather than once per sentence. Every call is recorded on their screen, including one that reached nothing: `matched` says how many sentences each side actually moved and `unknown_ids` lists the ids that named nothing, so check both rather than assuming the mask took. Call get_masking_report afterwards to see the page as they now see it.",
"inputSchema": {
"type": "object",
"properties": {
"show": {
"type": "object",
"properties": {
"section_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"paragraph_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"sentence_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"hide": {
"type": "object",
"properties": {
"section_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"paragraph_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"sentence_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"reason": {
"type": "string",
"description": "Why this reader can see, or must not see, what this call names. Shown on their screen."
}
},
"required": [
"reason"
],
"additionalProperties": false
},
"page": "/?sensitivity=65"
}add_rulesAction
Add a standing rule: every sentence carrying one of `phrases` comes off the reader's screen, wherever it appears, in every article they open, at every sensitivity including the one that withholds nothing else, and in later sessions — a rule is kept on their device until they take it down. So add one for something they never want to meet again rather than for one page: a character whose fate they do not want, a name they have asked you never to mention, anything past where they have watched or read. Matching is literal and case-insensitive, so give the phrase in the form the article uses it and add the variants beside it. `label` is what the reader is shown in place of the phrases and MUST be safe for them to read: a description of the ground the rule covers, never the phrases reworded and never the name or the event. "The fate of a main character" and "Developments after volume 30" are labels; "Levi dies" is not, and a label that repeats one of its own phrases fails the call. `reason` is why you added it and is shown beside the label. They see the label, how many sentences of the article in front of them it reached and your reason, and can uncover the phrases or take the rule down; nothing here removes one, so ask them if they should. Call get_masking_report afterwards for what the page is now withholding.
View tool JSON
{
"name": "add_rules",
"kind": "act",
"impl": "imperative",
"description": "Add a standing rule: every sentence carrying one of `phrases` comes off the reader's screen, wherever it appears, in every article they open, at every sensitivity including the one that withholds nothing else, and in later sessions — a rule is kept on their device until they take it down. So add one for something they never want to meet again rather than for one page: a character whose fate they do not want, a name they have asked you never to mention, anything past where they have watched or read. Matching is literal and case-insensitive, so give the phrase in the form the article uses it and add the variants beside it. `label` is what the reader is shown in place of the phrases and MUST be safe for them to read: a description of the ground the rule covers, never the phrases reworded and never the name or the event. \"The fate of a main character\" and \"Developments after volume 30\" are labels; \"Levi dies\" is not, and a label that repeats one of its own phrases fails the call. `reason` is why you added it and is shown beside the label. They see the label, how many sentences of the article in front of them it reached and your reason, and can uncover the phrases or take the rule down; nothing here removes one, so ask them if they should. Call get_masking_report afterwards for what the page is now withholding.",
"inputSchema": {
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"phrases": {
"type": "array",
"items": {
"type": "string"
},
"description": "Literal phrases, as the article writes them. Any one of them withholds the sentence."
},
"label": {
"type": "string",
"description": "What the reader is shown instead of the phrases. Say what the rule covers, not what it hides."
},
"reason": {
"type": "string",
"description": "Why this reader wants this hidden. Shown on their screen."
}
},
"required": [
"phrases",
"label",
"reason"
],
"additionalProperties": false
}
}
},
"required": [
"rules"
],
"additionalProperties": false
},
"page": "/?sensitivity=65"
}get_masking_reportAnswer
Audit what the reader is looking at: how many sentences are on their screen and how many are withheld, every standing rule by its label and how many sentences of this article it reaches, everything apply_mask and add_rules have done and the reason you gave for each, and which sections read_article_content has read. No article text and no rule phrases, so this is safe to summarise back to the reader — it is how you tell them what you withheld without telling them what was in it.
View tool JSON
{
"name": "get_masking_report",
"kind": "answer",
"impl": "imperative",
"description": "Audit what the reader is looking at: how many sentences are on their screen and how many are withheld, every standing rule by its label and how many sentences of this article it reaches, everything apply_mask and add_rules have done and the reason you gave for each, and which sections read_article_content has read. No article text and no rule phrases, so this is safe to summarise back to the reader — it is how you tell them what you withheld without telling them what was in it.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"page": "/?sensitivity=65"
}