Dossier tools
The 27 tools that keep a record of what was decided on a project, and the document it produces.
A conversation disappears, a project runs for months. These twenty-five tools let your agent write down what was retained into a dossier you reopen, annotate and export from stratta.ch/dossiers, and read and do everything the dossier page can read and do to a question.
You don't call them by hand. Your agent does, while it works, following the policy described in
get_methodology.
These tools are open to any member of the organisation, unlike the ingestion tools, which are restricted to owners and admins. A dossier is your own work, not the bureau's shared corpus.
What a dossier holds
A dossier is a set of questions to settle, for example "Can pile P38 be kept?" or "Which φ'k do we retain for the fill?". The question, not the standalone entry, is the unit of work: it is what gets assigned, reviewed and closed.
| Element | What it is | Tool |
|---|---|---|
| Question | What is still to be settled | open_question |
| Evidence | What backs an answer: a citation, a retained value, an observation | save_finding |
| Option | A way of settling the question, named when it is opened | listed in open_question |
| Decision | What you confirmed, and why | record_decision |
A piece of evidence can be recorded before you even know which question it serves: it stays "unclassified", and you file it later from the app. Three kinds of evidence, and the distinction is not decoration:
| Kind | What it is | Expected fields |
|---|---|---|
reference | What the norm says | normCode, sectionPath, page |
hypothesis | The value you retain, and why | value, detail, confidence |
observation | What the site showed | detail with the date |
In structural work a retained value is the output of a formula and recomputing it settles any
argument. In geotechnics it is a judgement made between three boreholes that disagree, and the
only thing reviewable six months later is the reasoning. Hence confidence:
established: computed, or read directly from the normjudgement: chosen by you between several possible valuesto_confirm: provisional, needs a test or a check
Confusing the three is the professional fault this field exists to prevent.
list_dossiers
Lists your organisation's dossiers, most recently touched first. Each row carries the entry count and, more importantly, the count of open questions, which is what points at the dossier to pick up.
No parameters.
open_dossier
Opens a project's dossier, creating it if it does not exist yet.
namestringrequiredHow you refer to the project, for example "Villa Morges, roof". This is the name you will use to resume it.
referencestringYour organization's project number, if it has one.
Idempotent on the name. Calling it twice with the same name returns the same dossier rather than creating a second one that would split the project's history in two.
Returns { dossierId, created }.
open_question
Opens one question to settle in a dossier, before gathering evidence for it. A question is
the unit of work: "Can pile P38 be kept?", "Which φ'k do we retain for the fill?". Evidence saved
with save_finding and the eventual record_decision hang off it.
One question per thing to settle: never put a list of sub-questions in the body. A question that bundles eight cannot be assigned, answered or closed one at a time. Open eight questions.
dossierIdstringrequiredReturned by open_dossier or list_dossiers.
titlestringrequiredThe question in one line, phrased as a question.
bodystringWhat is at stake and why it is not settled, in two or three sentences. Not a list of sub-questions.
optionsarrayThe ways this could be settled, when the norm or you put several forward: "abandon the pile", "recover it by re-concreting plus integrity tests", "redistribute onto P37/P39". One short name each, ten at most.
Idempotent on the title. Reopening the same wording returns the question already open, with its evidence.
Returns { questionId, created }.
list_attachments
Lists the project attachments of a dossier (site reports, borehole logs, meeting minutes, data sheets), with their extraction status. An agent reads them before answering on a project.
dossierIdstringrequiredThe dossier.
attachmentsarrayid, name, mimeType, bytes, pageCount, status (pending, ready,
failed), note, addedAt.
read_attachment
Reads the text of an attachment as a Markdown document, page by page, in windows.
attachmentIdstringrequiredFrom list_attachments or search_in_dossier.
fromnumberdefault: 1First page.
tonumberdefault: lastLast page.
maxCharsnumberdefault: 12000Characters per call (500 to 40000). When truncated is true, call again with
from set to nextPage.
markdownstringThe pages read, each under a ## p. N heading. A scan without a text layer
says so.
search_in_dossier
Full-text search over the attachments of one dossier, accents and case ignored.
dossierIdstringrequiredThe dossier.
keywordstringrequiredSearch terms in the language of the documents.
limitnumberdefault: 10Maximum hits (1 to 30).
hitsarrayattachmentId, name, page, snippet.
On the local server only, add_attachment uploads a file from the user's
machine (PDF, DOCX, XLSX, PNG, JPEG, TXT, MD, CSV, 25 MB at most, 20 per
dossier). The remote connector has no disk: upload from the dossier page
instead.
list_templates
Lists the dossier templates of the organization: checklists by type of structure, each a set of questions with the clauses they rest on. No parameter.
templatesarrayid, name, description, questions, citations.
apply_template
Opens the questions of a template in a dossier, with their options, and files every clause that
resolves in the corpus as a reference entry under its question. A clause the organization
cannot read is written into the question body as something to establish. Applying twice opens
nothing twice.
dossierIdstringrequiredThe dossier.
templateIdstringrequiredFrom list_templates.
resultobjectquestionsOpened, referencesFiled, unresolved[] (question, normCode,
sectionPath).
draft_deliverable
Opens the document a dossier produces (project basis, use agreement, geotechnical report,
verification note, other) and returns its plan: one section per chapter, with its path, its
title, a hint of what belongs there, its state (gap, current, stale, with the reason when a
source moved) and an excerpt of what is
already written. The plan is the office plan validated for that kind when there is one
(Methods page), otherwise the one Stratta proposes. Also returns the decisions of the dossier
with their ids, so write_section can cite them, and the site when there is one. Calling it
twice on the same dossier and kind returns the same document, never a second one.
dossierIdstringrequiredThe dossier.
kindstringrequiredproject_basis, use_agreement, geotechnical_report, verification_note
or other.
titlestringThe title, when the user named it. Default: the kind and the dossier name.
resultobjectdeliverableId, created, title, kind, status, templateName,
sections[] (path, title, level, hint, state, staleReason,
excerpt, sourceCount), decisions[] (entryId, question, title,
value, clause), openQuestions[], siteId.
write_section
Writes one section of the document: the text as it will be printed, and what it rests on.
Every sentence of substance comes from a source the section lists: a decision or piece of
evidence of the dossier (entry, the entry id), a site fact (fact, the fact key such as
groundwater.level), a clause read (clause, "SIA 267 s. 9.5.2"), a page of an
attachment (attachment, the id followed by #p12), a reading (reading). A section
without a source is refused; when the dossier holds nothing for it, gap true and a body
that says what is missing: the section is printed as something to establish. Replaces what
the section held. A signed document is not written. When a source moves afterwards (a
decision retaken, an entry deleted, a rescan of the site, a new edition), the section goes
stale with the reason; rewriting it, or keeping it from the dossier page, brings it back.
deliverableIdstringrequiredFrom draft_deliverable.
pathstringrequiredThe section path in the plan, "2" or "3.1".
bodystringrequiredThe text, prose or light Markdown, up to 12,000 characters.
sourcesarrayrequiredA list of {kind, ref, label?}. At least one unless gap.
gapbooleantrue when the dossier holds nothing for this section.
resultobjectstate: current or gap.
save_finding
Records one piece of evidence in a dossier. Your agent calls it as it works, not in a batch at the end: evidence saved when it is found carries the reasoning that produced it.
dossierIdstringrequiredReturned by open_dossier or list_dossiers.
questionIdstringThe question this evidence serves, from open_question or load_dossier.
Omit only when you do not yet know which one: the entry is saved
"unclassified", and you file it later from the app.
kindstringrequiredreference, hypothesis or observation. See the table above.
titlestringrequiredThe fact in one line, as you would write it in a report.
detailstringThe reasoning: why this value, what it rests on, what disagreed.
valuestringThe retained value with its unit, for example 30° or 1.25 kN/m².
confidencestringestablished, judgement or to_confirm.
normCodestringSource norm, for example SIA 267.
sectionPathstringExact section path, for example 9.5.2.1.
pagenumberPage in the norm, so you can verify it in your own PDF.
normEditionstringThe edition cited, for example "2013" or "2020 + rect. 2022", when
list_norms gives it.
record_decision
Records what you retained: the decision in one line, why, and the clause it rests
on. Two ways to name the question: questionId when it already exists, or dossierId and
question (what is settled, in one line) and the question is opened already decided, in the
same call. The question leaves the open items and keeps its evidence; the decision becomes the
entry a reviewer reads first.
Your agent only calls this once you have confirmed the decision, never on its own reasoning.
questionIdstringReturned by open_question or load_dossier, when the question exists.
dossierIdstringWithout questionId: the dossier the decision belongs to.
questionstringWithout questionId: what is settled, in one line ("Friction angle of the
moraine"). The same words find a question already opened.
retainedOptionstringThe option that was retained, by name, when the question listed some. An option not listed yet is created on the fly.
titlestringrequiredThe decision in one line.
detailstringThe reasoning.
valuestringThe retained value with its unit, when the decision carries one.
confidencestringestablished, judgement or to_confirm.
normCodestringSource norm.
sectionPathstringExact section path.
pagenumberPage in the norm.
normEditionstringThe edition cited.
Returns { entryId }.
load_dossier
Reloads everything a dossier holds: its questions with their evidence, options and decisions,
then the evidence not yet filed under a question, then the comments. Open questions come
first, read them before anything else and tell the user what is still open. Long texts are cut
(an entry detail at 280 characters, a question body at 480): get_question gives them whole.
Just say "pick the Villa Morges dossier back up": your agent calls this before answering anything about the project, and builds on what was decided instead of deciding it again.
dossierIdstringPreferred when the agent already has it.
namestringThe project name, when you name it rather than giving an id. Matched exactly.
One of the two is required.
resolve_question
Closes a question that stopped mattering without a decision: the variant was abandoned, the
client withdrew the request, the point became moot. The question stays in the dossier, marked
closed, with its evidence. To settle a question with an answer, call record_decision instead.
questionIdstringrequiredReturned by open_question or load_dossier.
resolvedbooleanDefaults to true. Pass false to reopen a question.
Reading one question at a time
load_dossier is the resume: the whole dossier, shaped small, open questions first. It is the
right first call and the wrong only call. What the dossier page shows and it does not: who a
question is assigned to and by when, the ids an agent needs to act on an option or an entry, an
entry's citation field by field rather than as one line, the comments with their author, the
history. The next four tools serve that, one page at a time: when nextCursor is present,
call the tool again with its value as cursor.
list_questions
The questions of a dossier, with their status, assignee, due date, options (each with its id)
and the title of the decision when there is one. The body is cut at 240 characters;
get_question gives it whole.
dossierIdstringrequiredThe dossier.
statusstringopen, decided or closed. Omit for all.
limitnumberdefault: 50Questions per page (1 to 200).
cursorstringThe nextCursor of the previous page.
get_question
One question in full: its wording, status, options with their description, its decision, its
evidence with every citation field (normCode, sectionPath, page, normEdition,
attachmentId, attachmentPage) and the option each piece argues for, and the comments left on
the question and on those entries, each with its author. Call it before adding anything to a
question, so nothing is filed twice.
questionIdstringrequiredFrom list_questions, load_dossier or open_question.
limitnumberdefault: 50Evidence entries per page (1 to 200).
cursorstringThe nextCursor of the previous page.
get_dossier_activity
The history of a dossier, most recent first: who did what and when, from the app or from an agent, each line with the question or the entry it concerns.
dossierIdstringrequiredThe dossier.
limitnumberdefault: 15Lines per page (1 to 200).
cursorstringThe nextCursor of the previous page.
list_exports
The verification notes and journals exported from a dossier, with their SHA-256 hash, the trusted timestamp when one was obtained and the methodology version in force. The file is downloaded from the dossier page; the tool says a note exists and lets you check a hash you were sent.
dossierIdstringrequiredThe dossier.
Acting on a question
Everything the dossier page can do to a question, your agent can do too, when you ask for
it. Two of these tools are irreversible: delete_question and delete_option ask for your
confirmation through the client before touching anything, like record_decision.
update_question
Rewords a question, rewrites what is at stake, assigns it to a member of the organisation by
e-mail address, or sets its due date. Only the fields given change; null clears the assignee
or the due date. Status goes through record_decision and resolve_question.
questionIdstringrequiredThe question.
titlestringThe new wording, in one line.
bodystringWhat is at stake, in two or three sentences.
assigneeEmailstring | nullThe address of a member of the organisation. null removes the assignee.
dueAtstring | nullAn ISO day, for example 2026-10-15. null removes the due date.
add_option
Adds one way of settling the question, when a variant comes up after it was opened. Idempotent
on the name: the same words return the option already listed. Ten options per question at most.
Returns { optionId, created }.
questionIdstringrequiredThe question.
namestringrequiredThe option in a few words.
descriptionstringWhat it implies, when the name is not enough.
update_option
Renames or describes an option, or marks it retained. Retaining one releases the others: a
choice has one answer. Retaining here does not settle the question; record_decision does, and
names the retained option itself.
optionIdstringrequiredFrom get_question, list_questions or load_dossier.
namestringThe new name.
descriptionstringThe new description.
retainedbooleantrue to retain it, false to release it.
delete_option
Removes an option from a question. The evidence filed under it stays on the question.
Irreversible: your confirmation is asked through the client, unless confirmed is true
because you already gave it in the conversation.
optionIdstringrequiredThe option.
confirmedbooleantrue when you already confirmed in the conversation.
delete_question
Deletes a question from a dossier. Its evidence stays in the dossier, unfiled; its options, its
comments and its decision go with it. A question that stopped mattering is closed with
resolve_question; only a question opened by mistake is deleted, and only when you say so. Your
confirmation is asked through the client.
questionIdstringrequiredThe question.
confirmedbooleantrue when you already confirmed in the conversation.
add_comment
Leaves a remark on the dossier, on a question or on an entry: a doubt about a value, a note for
a colleague, the reason a piece of evidence was set aside. A comment is signed by the connected
user and is not evidence: what the norm says goes through save_finding. A signed-off dossier
still takes comments.
dossierIdstringrequiredThe dossier.
bodystringrequiredThe comment.
questionIdstringThe question concerned, if any.
entryIdstringThe entry concerned, if any.
update_entry
Corrects a piece of evidence or a decision in place: its wording, its value, its confidence, or
the citation when the wrong clause was cited. Only the fields given change; page: null clears
the page. The kind and the question do not change here.
entryIdstringrequiredFrom get_question or load_dossier.
titlestringThe fact in one line.
detailstringThe reasoning.
valuestringThe value with its unit.
confidencestringestablished, judgement or to_confirm.
normCodestringThe norm.
sectionPathstringThe section path.
pagenumber | nullThe page. null clears it.
normEditionstringThe edition cited.
attach_entry
Files a piece of evidence under a question, and optionally under one of its options, or takes
it out with questionId: null. This is how the "unclassified" pile of load_dossier empties:
read it, find the question it answers, file it. A decision cannot be moved: it belongs to its
question.
entryIdstringrequiredThe entry.
questionIdstring | nullrequiredThe question to file it under, or null to leave it unfiled.
optionIdstring | nullThe option of that question the entry argues for, or null.
Limits
To bound a looping agent, without any of it being billed:
| Limit | Value |
|---|---|
| Dossiers per organisation | 200 |
| Questions per dossier | 200 |
| Options per question | 10 |
| Entries per dossier | 500 |
| Comments per dossier | 500 |
A signed-off dossier takes no further entries or edits. Comments stay open: closing a dossier is not the end of the conversation about it.
What Stratta does not do
The dossier documents your reasoning; it does not replace it. Stratta never concludes that a structure is compliant, and an agent must not write down an assumption you have not validated.