@probo/skills 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/COMPATIBILITY.md
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
Copyright (c) 2026 Probo Inc <hello@probo.com>.
|
|
3
3
|
|
|
4
|
-
Permission
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
in the Software without restriction, including without limitation the rights
|
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
|
12
|
+
all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
SOFTWARE.
|
|
15
21
|
-->
|
|
16
22
|
|
|
17
23
|
# Multi-agent compatibility
|
package/package.json
CHANGED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: compliance-portal-commitments
|
|
3
|
+
description: >-
|
|
4
|
+
Create or update the public commitments (commitment groups and their commitments) shown on a Probo
|
|
5
|
+
compliance portal, grounded strictly in the organization's own published Probo
|
|
6
|
+
policies and written in a factual, understated engineering voice. Use this skill whenever the user
|
|
7
|
+
wants to add, write, draft, edit, rewrite, curate, trim, or publish compliance portal commitments,
|
|
8
|
+
"security commitments", or a compliance portal security section for a company on Probo; asks what
|
|
9
|
+
commitments to show for a company doing SOC 2 or ISO 27001; gives an organization name or ID and asks
|
|
10
|
+
to build out its compliance portal commitments; or wants existing commitments reworded to sound less like
|
|
11
|
+
marketing. Always pull the real published policies first, surface only the specific and differentiating
|
|
12
|
+
controls a skeptical security reviewer would find useful, and create or update them through the Probo
|
|
13
|
+
MCP. Never invent controls that are not in the published policies.
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Probo compliance portal commitments
|
|
17
|
+
|
|
18
|
+
A Probo compliance portal can display **commitments**: short, public statements about the security controls a
|
|
19
|
+
company actually operates. They live in **commitment groups**. Put all of a company's commitments under a
|
|
20
|
+
**single group titled "Security at <company name>"** (for example "Security at Captain") with a one-line
|
|
21
|
+
description; each commitment is one card in that group. Do not split commitments across multiple groups.
|
|
22
|
+
|
|
23
|
+
Each commitment has four fields:
|
|
24
|
+
|
|
25
|
+
- **icon** — one value from a fixed set (see `references/portal-mechanics.md`)
|
|
26
|
+
- **eyebrow** — a short category label above the title (e.g. "Encryption", "Authentication")
|
|
27
|
+
- **title** — a short heading, under six words
|
|
28
|
+
- **description** — one plain sentence (two only if the second adds a genuinely separate fact) describing
|
|
29
|
+
what is true of the system, in the company's own voice ("We encrypt your data..."). One idea per card.
|
|
30
|
+
Describe the security property, not the policy or the procedure behind it. Do not stack facts, and do not
|
|
31
|
+
reference documents ("a formal X Plan that defines...") or internal ceremony (approval chains, ticket
|
|
32
|
+
logging).
|
|
33
|
+
|
|
34
|
+
The reader you are writing for is a **technical buyer skimming your public trust page**, not an auditor
|
|
35
|
+
cross-checking evidence. They are skeptical of marketing but they are reading fast. Every claim must still
|
|
36
|
+
be true and verifiable, but write it plainly and in the company's own voice, speaking to the reader: first
|
|
37
|
+
person for what the company does ("We enforce MFA"), second person for what the reader gets ("your data").
|
|
38
|
+
Aim for the way the security pages at routine.co/security and supabase.com/security read: short cards, one
|
|
39
|
+
outcome each, no policy prose. That register drives the whole workflow below.
|
|
40
|
+
|
|
41
|
+
Work in four stages: **get context → draft → filter → publish**. Do not skip straight to publishing.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 1. Get context (read the real policies first)
|
|
46
|
+
|
|
47
|
+
Commitments must trace to controls the company genuinely has. The source of truth is the organization's
|
|
48
|
+
**published policies** in Probo, not general knowledge about SOC 2 or ISO 27001.
|
|
49
|
+
|
|
50
|
+
1. **Find the Probo MCP and the organization.** This environment may expose more than one Probo MCP
|
|
51
|
+
server (for example a US and an EU instance). Call `listOrganizations` on each until you find the one
|
|
52
|
+
that returns the target company, and use that server for every later call. Match the organization the
|
|
53
|
+
user named and capture its `id`.
|
|
54
|
+
2. **List the published policies.** Call `listDocuments` with `document_types: ["POLICY"]`. Policies with
|
|
55
|
+
a `current_published_major` are published.
|
|
56
|
+
3. **Read the actual content.** `getDocument` returns metadata only. To get the text, call
|
|
57
|
+
`listDocumentVersions` for each policy with `filter: {statuses: ["PUBLISHED"]}`,
|
|
58
|
+
`order_by: {field: "CREATED_AT", direction: "DESC"}`, `size: 1`. The returned version includes the
|
|
59
|
+
`title` and the full `content`. Fetch the policies in parallel.
|
|
60
|
+
|
|
61
|
+
Read the substance, not just the titles. The specific, quotable facts live inside the statements: exact
|
|
62
|
+
algorithms (AES-256), protocols (TLS, SSH, VPN), tools (SAST, secret scanning), cadences (quarterly
|
|
63
|
+
access reviews, annual penetration test, daily backups retained 30 days), and mechanisms (signed commits,
|
|
64
|
+
protected main branch, SSO, MFA). These specifics are what make a commitment credible.
|
|
65
|
+
|
|
66
|
+
Do not pull details from the web and do not assume a control exists because the framework expects it. If a
|
|
67
|
+
policy says "TLS", write "TLS", not "TLS 1.3". If it says data is retained per contract, do not invent a
|
|
68
|
+
fixed retention window.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 2. Draft candidate commitments
|
|
73
|
+
|
|
74
|
+
All commitments go under one group titled "Security at <company name>", so there is no theming decision to
|
|
75
|
+
make. Draft a single ordered list of the strongest cards, and order them so related ones sit next to each
|
|
76
|
+
other (for example encryption and backups, then access, then development, then operations). Do not create
|
|
77
|
+
multiple groups. Give the group one light line of description, or leave it off; keep it in the same direct
|
|
78
|
+
voice, not a policy heading.
|
|
79
|
+
|
|
80
|
+
For each candidate commitment, write down which policy statement backs it. If you cannot point to a
|
|
81
|
+
sentence in a published policy, drop the commitment. This is the grounding check and it is not optional.
|
|
82
|
+
|
|
83
|
+
Then apply the voice in `references/voice.md`. The tone is calm, factual, and technical, the way internal
|
|
84
|
+
engineering documentation reads. Load that file before writing any titles or descriptions; the difference
|
|
85
|
+
between a good and a bad commitment here is almost entirely tone.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 3. Filter: what earns a place
|
|
90
|
+
|
|
91
|
+
The instinct is to publish everything. Resist it. A compliance portal that lists ten generic commitments is
|
|
92
|
+
weaker than one that lists five specific ones, because the generic entries signal "marketing" and make the
|
|
93
|
+
reader trust the whole page less.
|
|
94
|
+
|
|
95
|
+
**Aim for roughly 6 to 8 short cards. Hard cap: at most 10 commitments in the group.** The
|
|
96
|
+
reference pages run 7 to 9 flat cards; that is the target feel. These caps are ceilings, not targets, and
|
|
97
|
+
fewer is usually better. If you have more strong candidates than fit, prioritize by importance to a
|
|
98
|
+
technical buyer and drop or fold the rest, then tell the user what you left out and offer to swap.
|
|
99
|
+
|
|
100
|
+
**Keep a commitment when it is:**
|
|
101
|
+
|
|
102
|
+
- **Specific** — names a real technology, cadence, or mechanism (AES-256, quarterly reviews, signed commits).
|
|
103
|
+
- **Differentiating** — not every SaaS company does it, or does it this concretely.
|
|
104
|
+
- **Verifiable** — an auditor could confirm it from evidence.
|
|
105
|
+
|
|
106
|
+
**Cut a commitment when it is:**
|
|
107
|
+
|
|
108
|
+
- **Generic** — a sentence that could appear unchanged on a hundred SaaS security pages.
|
|
109
|
+
- **Table-stakes with nothing specific to add** — the fact is expected and you have no concrete detail
|
|
110
|
+
that makes it interesting.
|
|
111
|
+
- **Thin or off-audience** — internal-culture or legal items that a vendor-security reviewer would skip
|
|
112
|
+
(code of conduct, office badge procedures, cookie policy).
|
|
113
|
+
- **Already shown elsewhere on the portal** — the compliance portal separately displays certifications and
|
|
114
|
+
frameworks (SOC 2, ISO 27001) and published documents. Do not add a "Certifications" commitment or
|
|
115
|
+
otherwise restate a badge, framework, or document the page already surfaces; it is redundant. Spend the
|
|
116
|
+
card on a control the portal does not already show.
|
|
117
|
+
|
|
118
|
+
There is no fixed list of "always cut" topics. The same topic can be worth keeping for one company and not
|
|
119
|
+
another. For example, disaster recovery is worth publishing if the company rehearses failovers and can
|
|
120
|
+
state a concrete objective; it is worth cutting if the entry would just say "we have a DR plan and test it
|
|
121
|
+
yearly", which every vendor claims. Judge each candidate against the three keep-criteria above.
|
|
122
|
+
|
|
123
|
+
Before publishing, show the user the proposed commitments and say briefly what you cut and why.
|
|
124
|
+
Let them adjust. They know which controls they want to lead with.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 4. Create or update in the compliance portal
|
|
129
|
+
|
|
130
|
+
Once the user has agreed on the set, write it through the Probo MCP. The exact tool sequence, the icon
|
|
131
|
+
enum, ordering/rank behavior, and the common pitfalls (read/write scope errors, reusing existing empty
|
|
132
|
+
groups instead of duplicating them, deleting a whole group vs individual commitments) are in
|
|
133
|
+
`references/portal-mechanics.md`. Read it before making any write calls.
|
|
134
|
+
|
|
135
|
+
Key habits:
|
|
136
|
+
|
|
137
|
+
- Publishing to a compliance portal is **public-facing**. Confirm the final copy with the user before writing,
|
|
138
|
+
and treat creates, updates, and deletes as changes that change what visitors see.
|
|
139
|
+
- Create the single "Security at <company name>" group first (or reuse it if it already exists), capture
|
|
140
|
+
its returned `id`, then attach every commitment to that id.
|
|
141
|
+
- Never create a second group. If the portal already has other groups from a previous run, fold their
|
|
142
|
+
commitments into the one group and remove the extras (confirm with the user before deleting).
|
|
143
|
+
- After writing, give the user a compact recap of the live state (groups and their commitments).
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Reference files
|
|
148
|
+
|
|
149
|
+
- `references/voice.md` — the tone-of-voice rules and before/after examples. Load this before writing any
|
|
150
|
+
commitment copy.
|
|
151
|
+
- `references/portal-mechanics.md` — the Probo MCP tool sequence, icon enum, and gotchas. Load this before
|
|
152
|
+
any create/update/delete call.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Portal mechanics: creating and updating commitments via the Probo MCP
|
|
2
|
+
|
|
3
|
+
Read this before making any write call. All tool names below are Probo MCP tools; the server prefix
|
|
4
|
+
varies by environment (there may be more than one Probo server, e.g. US and EU). Use the server whose
|
|
5
|
+
`listOrganizations` returns the target organization.
|
|
6
|
+
|
|
7
|
+
## Tool sequence
|
|
8
|
+
|
|
9
|
+
1. **Resolve the organization** — `listOrganizations`, match by name, keep the `id`.
|
|
10
|
+
2. **Resolve the compliance portal** — `getCompliancePortal` with `organization_id`. Keep
|
|
11
|
+
`compliance_portal.id`; every group call takes it as the `compliance_portal_id` argument.
|
|
12
|
+
3. **Read what already exists** — `listCommitmentGroups` with the `compliance_portal_id`, and
|
|
13
|
+
`listCommitments` with a `group_id`. Do this so you reuse the existing group instead of duplicating it.
|
|
14
|
+
Order by `{field: "RANK", direction: "ASC"}`.
|
|
15
|
+
4. **Create the single group** — all commitments live under one group titled "Security at <company name>".
|
|
16
|
+
If it does not exist yet, `addCommitmentGroup` with `compliance_portal_id`, `title`, `description`; if it (or
|
|
17
|
+
any other group) already exists, reuse it. Capture the returned `commitment_group.id`. You need it to
|
|
18
|
+
attach commitments.
|
|
19
|
+
5. **Add commitments** — `addCommitment` with `group_id`, `icon`, `eyebrow`, `title`, `description`. These
|
|
20
|
+
can be sent in parallel once you have the group id.
|
|
21
|
+
|
|
22
|
+
## Updating and deleting
|
|
23
|
+
|
|
24
|
+
- `updateCommitmentGroup` — takes `id`; any of `title`, `description`, `rank` are optional. Null/omitted
|
|
25
|
+
fields are left unchanged.
|
|
26
|
+
- `updateCommitment` — takes `id`; any of `icon`, `eyebrow`, `title`, `description`, `rank` are optional.
|
|
27
|
+
- `deleteCommitment` — takes the commitment `id`.
|
|
28
|
+
- `deleteCommitmentGroup` — takes the group `id`. Deleting a group removes the commitments inside it, so
|
|
29
|
+
to remove a whole theme (and its commitments) you can delete the group directly rather than each
|
|
30
|
+
commitment first.
|
|
31
|
+
|
|
32
|
+
## Ordering
|
|
33
|
+
|
|
34
|
+
Both groups and commitments have a `rank` (1-based) that sets display order. New items get the next rank
|
|
35
|
+
in creation order. To reorder, pass `rank` to the update call.
|
|
36
|
+
|
|
37
|
+
## Icon enum
|
|
38
|
+
|
|
39
|
+
`icon` must be exactly one of these values:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
LOCK_KEY, EYE_SLASH, FINGERPRINT, SHIELD_WARNING, SHIELD_CHECK, SIREN, KEY, LOCK,
|
|
43
|
+
CLOUD, DATABASE, GLOBE, EYE, USERS, CERTIFICATE, GAVEL, HEARTBEAT, BELL, BUG, CODE, SERVER
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Sensible mappings:
|
|
47
|
+
|
|
48
|
+
- Encryption / data at rest: `LOCK`
|
|
49
|
+
- Data deletion / privacy: `EYE_SLASH`
|
|
50
|
+
- Data inventory / storage: `DATABASE`
|
|
51
|
+
- Authentication (SSO/MFA): `KEY`
|
|
52
|
+
- Identity / least privilege: `FINGERPRINT`
|
|
53
|
+
- Production / infrastructure access: `SERVER`
|
|
54
|
+
- Source control / code: `CODE`
|
|
55
|
+
- Vulnerability scanning / testing: `BUG`
|
|
56
|
+
- Monitoring / logging: `EYE`
|
|
57
|
+
- Alerting: `BELL` or `SIREN`
|
|
58
|
+
- Threat / risk: `SHIELD_WARNING`
|
|
59
|
+
- Controls in place / audited: `SHIELD_CHECK` or `CERTIFICATE`
|
|
60
|
+
- Governance / legal / compliance: `GAVEL`
|
|
61
|
+
- Vendors / people: `USERS`
|
|
62
|
+
- Availability / uptime: `HEARTBEAT`
|
|
63
|
+
- Cloud / hosting: `CLOUD`
|
|
64
|
+
- Networking / public surface: `GLOBE`
|
|
65
|
+
|
|
66
|
+
## Gotchas seen in practice
|
|
67
|
+
|
|
68
|
+
- **`insufficient scope`.** The connected MCP token may be read-only for the compliance portal, or may not yet
|
|
69
|
+
have commitment write scope at all. If creates fail with `insufficient scope`, nothing was written.
|
|
70
|
+
Tell the user to re-authorize / refresh the Probo MCP connection with compliance-portal write scope, then
|
|
71
|
+
retry the same batch. Do not keep retrying the identical call; the scope has to change first.
|
|
72
|
+
- **One group only.** All commitments belong under a single group titled "Security at <company name>". If
|
|
73
|
+
the portal already has a group (whatever its title), reuse it rather than creating a second one; rename it
|
|
74
|
+
with `updateCommitmentGroup` if its title is not "Security at <company name>". If earlier runs left several
|
|
75
|
+
groups, consolidate: move commitments into the one group and delete the extras (confirm before deleting).
|
|
76
|
+
- **Publishing is public.** Creates, updates, and deletes change what visitors to the compliance portal see.
|
|
77
|
+
Confirm the copy with the user before writing.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Voice: how commitments should read
|
|
2
|
+
|
|
3
|
+
Write copy that sounds like it was written by a senior infrastructure engineer, not a marketing team.
|
|
4
|
+
The page is a public trust page, read by a technical buyer skimming fast. They are skeptical of marketing,
|
|
5
|
+
but they are not an auditor reading your evidence line by line. Write short, plain cards that state one
|
|
6
|
+
security outcome each. For the target feel, read routine.co/security and supabase.com/security: a card is a
|
|
7
|
+
heading and a sentence, never a paragraph of policy.
|
|
8
|
+
|
|
9
|
+
Write in the company's own voice, speaking to the reader. Use the first person ("we") for what the company
|
|
10
|
+
does and the second person ("your data", "your workloads") for what the reader gets. This is the single
|
|
11
|
+
biggest lever against generic copy: "We encrypt your data at rest with AES-256" reads direct and specific,
|
|
12
|
+
where "Data is encrypted at rest with AES-256" reads like a policy clause. Prefer the active, direct form.
|
|
13
|
+
It stays factual; it is not marketing.
|
|
14
|
+
|
|
15
|
+
Two tests for every sentence:
|
|
16
|
+
- **If it could appear unchanged on a hundred SaaS security pages, rewrite it.**
|
|
17
|
+
- **If it describes a document or a procedure instead of what is true of the system, rewrite it.**
|
|
18
|
+
|
|
19
|
+
## Principles
|
|
20
|
+
|
|
21
|
+
- State facts, not aspirations. First person is for what is already true ("We enforce MFA"), never for
|
|
22
|
+
intentions ("We are committed to MFA", "We aim to..."). If it is not in place today, leave it off.
|
|
23
|
+
- Describe the security property, not the policy or the procedure. Say what is true of the system, not that
|
|
24
|
+
a document exists or what steps a process follows. Cut references to "a formal X Plan/Policy that
|
|
25
|
+
defines...", approval chains, and ticket logging.
|
|
26
|
+
- One idea per card. Do not stack two or three facts into one description; split them or drop the weaker one.
|
|
27
|
+
- Use specific technologies and practices where the policy supports them: TLS, AES-256, SAST, MFA, SSO,
|
|
28
|
+
signed commits, SSH, VPN, penetration testing. Naming the actual tool or provider (Snyk, the cloud
|
|
29
|
+
provider's SOC 2, Stripe for PCI) is concrete and reads well, when the policy supports it.
|
|
30
|
+
- Avoid adjectives unless they are measurable. "Encrypted with AES-256" is measurable; "industry-leading
|
|
31
|
+
encryption" is not.
|
|
32
|
+
- Body copy explains how something works, not why it is impressive.
|
|
33
|
+
- Calm and understated beats persuasive. Do not try to sound clever.
|
|
34
|
+
- Every claim must still be true and defensible, but write it for a reader skimming, not for an audit file.
|
|
35
|
+
|
|
36
|
+
## Hard rules
|
|
37
|
+
|
|
38
|
+
- No slogans, buzzwords, or inspirational language.
|
|
39
|
+
- No metaphors or analogies. ("No public door to production" is a metaphor; cut it.)
|
|
40
|
+
- No punchy two-sentence headlines.
|
|
41
|
+
- Headings under six words.
|
|
42
|
+
- Banned phrases and their kin: "built in, not bolted on", "best-in-class", "enterprise-grade", "we hunt
|
|
43
|
+
for threats", "around the clock", "bank-grade", "military-grade", "peace of mind", "always".
|
|
44
|
+
- Do not overclaim with absolutes. Prefer a plain statement of the control over "there is no way for X".
|
|
45
|
+
|
|
46
|
+
## Titles
|
|
47
|
+
|
|
48
|
+
Titles are short, up to six words. A plain noun label ("Least privilege by default") or a short active
|
|
49
|
+
statement ("MFA is enforced", "Every change is reviewed") both work. Not punchy marketing headlines, not
|
|
50
|
+
two-sentence slogans. The description carries the detail.
|
|
51
|
+
|
|
52
|
+
- Prefer "MFA is enforced" over "SSO first. MFA always."
|
|
53
|
+
- Prefer "Data encrypted in transit and at rest" over "Encrypted at rest. Encrypted in transit. Always."
|
|
54
|
+
- Prefer "Every change is reviewed" over "Every commit signed. Every change reviewed."
|
|
55
|
+
- Prefer "Production access" over "No public door to production."
|
|
56
|
+
|
|
57
|
+
## Descriptions
|
|
58
|
+
|
|
59
|
+
One sentence is the default. A second only if it carries a genuinely separate fact. State the outcome and,
|
|
60
|
+
where the policy gives one, a specific mechanism or cadence, then stop. Keep a card to roughly 25 words.
|
|
61
|
+
One idea per card: if you are writing "X. Y. Z." with three separate controls, split them into separate
|
|
62
|
+
cards or drop the weakest. Read like a single line on a trust page a customer skims, not like a paragraph
|
|
63
|
+
lifted from the policy.
|
|
64
|
+
|
|
65
|
+
## Before / after
|
|
66
|
+
|
|
67
|
+
Three ways a card goes wrong: it reads like marketing, it reads like the policy it came from, or it is
|
|
68
|
+
written impersonally in the third person. The "Ship" line is short, direct, and in the company's own voice
|
|
69
|
+
(we/your).
|
|
70
|
+
|
|
71
|
+
**Encryption** (marketing)
|
|
72
|
+
- Before: "Customer data is protected with industry-leading encryption from storage to transit."
|
|
73
|
+
- Ship: "Data encrypted in transit and at rest" / "Your data is encrypted in transit with TLS and at rest with AES-256."
|
|
74
|
+
|
|
75
|
+
**Authentication** (impersonal)
|
|
76
|
+
- Before: "MFA is required for privileged accounts and critical systems."
|
|
77
|
+
- Ship: "MFA is enforced" / "We enforce MFA for privileged accounts and critical systems."
|
|
78
|
+
|
|
79
|
+
**Least privilege** (policy prose)
|
|
80
|
+
- Before: "Access is granted on a least-privilege basis. Requests are approved by the system owner and logged. Access rights are reviewed quarterly."
|
|
81
|
+
- Ship: "Least privilege by default" / "We grant the minimum access needed and review it quarterly."
|
|
82
|
+
|
|
83
|
+
**Secure development** (three facts in one card, so split it)
|
|
84
|
+
- Before: "Code is scanned with SAST and secret scanning. Container images are scanned before deployment. The production environment is penetration tested once a year."
|
|
85
|
+
- Ship, card 1: "We scan code and images" / "We scan code and container images before every deploy."
|
|
86
|
+
- Ship, card 2: "Pen-tested every year" / "We run an external penetration test once a year."
|
|
87
|
+
|
|
88
|
+
**Incident response** (describes a document, not the system)
|
|
89
|
+
- Before: "Critical and security-related issues are handled through a formal Incident Response Plan that defines roles, procedures, and escalation."
|
|
90
|
+
- Ship: "Incident response" / "We investigate security incidents on a defined escalation path."
|
|
91
|
+
|
|
92
|
+
**Monitoring** (policy prose)
|
|
93
|
+
- Before: "Application logs are retained for at least 30 days and aggregated to a central platform. Production outages trigger alerts to on-call engineers."
|
|
94
|
+
- Ship: "We monitor production" / "We centralize our logs and keep them 30 days. Outages page our on-call engineers."
|
|
95
|
+
|
|
96
|
+
## Group description
|
|
97
|
+
|
|
98
|
+
There is one group, titled "Security at <company name>". Keep its description to one short line in the same
|
|
99
|
+
direct voice, or leave it off. "How we protect your data and our platform" is fine; a line like "How access
|
|
100
|
+
to systems and production is granted and reviewed" reads like a policy table of contents, which is the tone
|
|
101
|
+
to avoid.
|
|
102
|
+
|
|
103
|
+
## A note on em dashes
|
|
104
|
+
|
|
105
|
+
Do not use em dashes (—) in the copy. Use periods, commas, colons, or parentheses instead. This is a
|
|
106
|
+
standing preference of the person this skill was built for.
|