Skip to content

docs: use placeholders for example values that trip content scanners - #3201

Merged
RaduAna-Maria merged 2 commits into
mainfrom
docs/placeholder-example-values
Sep 10, 2026
Merged

RaduAna-Maria merged 2 commits into
mainfrom
docs/placeholder-example-values

Conversation

@RaduAna-Maria

Copy link
Copy Markdown
Collaborator

Summary

  • Replace literal dates, addresses, phone numbers, and identifier-shaped digit runs in 10 documentation files with the repo's existing <UPPER_SNAKE_CASE> placeholder convention
  • Unblocks a customer whose content-inspection gate rejected the published package on 21 findings — all false positives on example text, but a shape-based gate blocks the artifact either way
  • Add the rule to CONTRIBUTING.md § CLI Commands and .claude/rules/content-quality.md so new examples don't reintroduce it

No credential, live PII, or cardholder data exists in the repo. An independent sweep over all tracked files (AWS key IDs, private keys, gh*_/xox*/sk_live tokens, JWTs, npm/PyPI tokens, Luhn-valid PANs) returned zero hits. This PR removes shapes, not secrets.

Changes

uipath-admin

  • pat-management.md, external-app-management.md--expiration "2027-01-15"--expiration "<EXPIRATION_DATE>"
  • audit-commands.md, audit-workflow-guide.md — export windows → <FROM_DATE> / <TO_DATE>; generated names → audit_<from>_<to>_<generatedAt>, the placeholder both files already used in prose

Both audit references are now free of every literal calendar date, not just the lines the customer's scan reported. The detector fired on an unpredictable subset — 2026-01-01 yes, 2026-04-22 no — so a partial fix would fail the next scan.

uipath-rpa

  • UiPath.Word.Activities/…/examples.md — mail-merge sample data → <COMPANY_NAME> / <STREET_ADDRESS> / <CONTACT_NAME> / <PHONE_NUMBER>
  • UiPath.AzureWVD.Activities/…/examples.md — placeholder GUID loses its digit runs: ffffffff-1111-2222-3333-444444444444ffffffff-aaaa-bbbb-cccc-dddddddddddd, matching the letter-based GUID on the line above it
  • legacy/data-manipulation-guide.md — regex table masks digit positions (NNN-NN-NNNN, MM/DD/YYYY) with a note explaining N; ParseExact takes a dateText variable instead of a literal
  • legacy/testing-guide.md — the "number too long" row describes its length instead of spelling out 11 digits

Left unchanged, deliberately

Four findings are product data the playbooks exist to convey, not examples. Editing them would break the page:

  • Orchestrator error code 170002 (uipath-troubleshoot) — the identifier being diagnosed
  • Two forum.uipath.com thread IDs inside URLs — the ID is the link
  • A Databricks documentation URL in vendor-docs-registry.json — matched a 40-char AWS-secret shape rule

These need an allowlist on the scanning side. The cleanest ask is excluding documentation-only artifacts from cardholder-data scanning: the package is Markdown and JSON reference material with no runtime data path.

Testing

  • npm run skills:validate — OK, default 27 skills / 1765 files; studioweb 27 / 1765 / 264 replacements
  • npm run skills:check-links — 6723 relative links, all resolve
  • npm run skills:build — both trees build clean
  • python scripts/check-skill-status.py — OK, 27 skills, manifest valid
  • python scripts/check-skills-sh.py — OK, 27 skills across 4 sections
  • Re-scanned all 10 files with the shape detectors that produced the original findings: 0 remaining matches

No skill folder added, renamed, or removed, so assets/skill-status.json and skills.sh.json need no edit. No flavor overrides or skill-flavor markers touch any edited file.

Reviewer notes

CONTRIBUTING.md deliberately spells out the literals it forbids, in the "Do not write" column. That file is not in files in package.json, so the anti-examples never reach a customer scan — there's an inline note saying so, and to exclude it if we ever add a repository-wide content scanner.

Worth considering as a follow-up: none of the 22 workflows scans content today, so nothing stops the next literal date from landing.

🤖 Generated with Claude Code

A customer content-inspection gate blocked the published package on 21
findings. All were false positives on documentation examples — no
credential, live PII, or cardholder data exists in the repo — but a
shape-based gate cannot tell the difference, and a blocked artifact
blocks the rollout either way.

Replace the literal example values we control with the repo's existing
<UPPER_SNAKE_CASE> placeholder convention, which identity-commands.md and
the audit guides already use:

- uipath-admin: literal --expiration dates and audit export date ranges
  become <EXPIRATION_DATE> / <FROM_DATE> / <TO_DATE>; generated folder
  names become audit_<from>_<to>_<generatedAt>. Both audit references are
  now free of literal calendar dates, so the scoping question does not
  come back on the next scan.
- uipath-rpa: mail-merge sample data becomes <COMPANY_NAME> /
  <STREET_ADDRESS> / <CONTACT_NAME> / <PHONE_NUMBER>; the placeholder GUID
  drops its digit runs; the regex reference table masks digit positions as
  N with a note; the "number too long" test row describes its length.

Left verbatim on purpose: Orchestrator error code 170002, two
support-forum thread IDs inside URLs, and a Databricks documentation URL.
Those are product data the playbooks exist to convey, not examples, so
they need an allowlist on the scanning side rather than an edit here.

Document the rule in CONTRIBUTING.md and .claude/rules/content-quality.md
so new examples do not reintroduce the problem.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Claude finished @RaduAna-Maria's task in 5m 8s —— View job


PR Review: docs: use placeholders for example values that trip content scanners

  • Read review criteria and project conventions
  • Analyze full diff
  • Read changed files for surrounding context
  • Check link validity, cross-skill references, secrets
  • Post review findings

Summary

Replaces literal dates, addresses, phone numbers, and identifier-shaped digit runs in 10 documentation files with the repo's existing <UPPER_SNAKE_CASE> placeholder convention. Adds the rule to CONTRIBUTING.md and .claude/rules/content-quality.md to prevent reintroduction.

Change-by-Change Review

1. .claude/rules/content-quality.md

Severity: OK

Two new bullets added under "CLI Command Documentation": one prescribing placeholder usage for shape-sensitive values, one carving out product identifiers. Both are placed logically after the existing <PLACEHOLDER> bullet. The first bullet is long but self-contained — it covers the rule, examples, and the masking convention in one pass, which is appropriate for a rules file that agents load in full.

2. CONTRIBUTING.md

Severity: OK

New subsection "Use placeholders for example values, not literals" under CLI Commands. Well-structured: motivation, do/don't table, format-in-prose guidance, two narrow exceptions. The blockquote explaining that CONTRIBUTING.md itself isn't in the published package (so its anti-examples won't trip the scanner) is a smart preemptive clarification. Checklist item at line 484 links to the new section with [Style Guide](#cli-commands) — anchor resolves correctly.

3. skills/uipath-admin/references/audit-commands.md

Severity: OK

All 11 changed lines replace literal dates and generated-at timestamps with <FROM_DATE>, <TO_DATE>, <GENERATED_AT>, and "..." for sample output values. The --to-date flag description (line 60) loses (for example 2026-02-01) but keeps the semantic instruction — acceptable tradeoff for scanner compliance. Relative link to ./audit-workflow-guide.md#common-gotchas confirmed valid.

4. skills/uipath-admin/references/audit-workflow-guide.md

Severity: OK

19 lines changed. All literal dates in CLI examples, export directory trees, and gotchas prose replaced with placeholders. The gotchas section rewrites are semantically equivalent — "pass the day after the window as an exclusive --to-date" replaces the concrete 2026-02-01 example without losing clarity. The <YYYY-MM-DD>.json placeholder on line 272 (export schema) is unchanged and correct — it describes a filename pattern, not an example value.

5. skills/uipath-admin/references/external-app-management.md

Severity: OK

Single line: "2027-06-01""<EXPIRATION_DATE>". Clean.

6. skills/uipath-admin/references/pat-management.md

Severity: OK

Two lines: "2027-01-15" and "2028-01-15""<EXPIRATION_DATE>". Clean.

7. skills/uipath-rpa/references/activity-docs/UiPath.AzureWVD.Activities/1.5/coded/examples.md

Severity: OK

GUID ffffffff-1111-2222-3333-444444444444ffffffff-aaaa-bbbb-cccc-dddddddddddd. Matches the letter-based GUID on the preceding line (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee). Eliminates the long digit runs that triggered the scanner.

8. skills/uipath-rpa/references/activity-docs/UiPath.Word.Activities/2.5/coded/examples.md

Severity: OK

Four mail-merge sample values replaced: "Acme Corporation""<COMPANY_NAME>", "123 Main Street, Suite 100""<STREET_ADDRESS>", "John Smith""<CONTACT_NAME>", "+1 (555) 123-4567""<PHONE_NUMBER>". The DateTime.Now.ToString("yyyy-MM-dd") line is correctly left alone — it's a format string, not a literal value.

9. skills/uipath-rpa/references/legacy/data-manipulation-guide.md

Severity: OK

Regex table examples masked: phone → (NNN) NNN-NNNN, dates → MM/DD/YYYY / YYYY-MM-DD, SSN → NNN-NN-NNNN. Explanatory blockquote added: "N marks a digit position." ParseExact example switches from literal "01/15/2025" to variable dateText, which correctly demonstrates the API without an inline date. The format string "MM/dd/yyyy" is preserved — it's a format spec, not data.

10. skills/uipath-rpa/references/legacy/testing-guide.md

Severity: OK

"INV-99999999999""INV-" + 11 digits. Describes the property being tested (number too long) rather than spelling out a scanner-triggering digit run. The surrounding table entries ("INV-12345", "inv-12345") are kept — those are short enough not to trigger a digit-run detector.

What's Missing

Nothing identified. No skill folders were added, renamed, or removed — CODEOWNERS and registry files need no edit. The scope is correctly limited to the 10 files with scanner findings plus the two rule files.

Area Ratings

Area Status Notes
Frontmatter N/A No SKILL.md frontmatter changed
E2E Tests N/A Documentation-only change, no new capabilities
Skill Body N/A No SKILL.md body changed
References & Assets OK All 8 reference file edits are clean, internally consistent, and preserve semantic meaning
Repo Hygiene OK No secrets, no cross-skill references, all relative links valid, changes scoped to affected files

Issues for Manual Review

  • Remaining literal dates in testing-guide.md lines 333–337. A DataTable test fixture uses "2024-01-15", "2024-02-20", "2024-03-10", "2024-12-31" as sample data. These weren't part of the customer's 21 findings and the PR's re-scan confirmed 0 matches, but they do carry the date shape. Worth confirming the scanner's detection threshold if the scan configuration changes.
  • CDate("01/02/2025") in data-manipulation-guide.md line 389. Used to illustrate a locale-dependent parsing trap — the specific digits are the point (is it Jan 2 or Feb 1?). Replacing it would harm the example. This correctly falls under the "product identifiers the reader needs verbatim" exception.
  • The PR description notes four intentionally unchanged findings (error code 170002, forum thread IDs in URLs, a Databricks documentation URL) that need an allowlist on the scanning side. This is the right call — editing those would break the playbooks.

Conclusion

Clean PR. All 10 file edits correctly replace scanner-triggering shapes with the repo's existing placeholder convention without losing semantic clarity. The two new rule additions (CONTRIBUTING.md subsection and content-quality.md bullets) are well-placed and cover both the prescription and its exceptions. No issues found — approve.


<FROM_DATE>T00:00:00Z glued a placeholder to a literal time fragment. It
kept the literal in the file, and read worse than either form alone —
every sibling flag in those same blocks (<USER_GUID>,
<ORCHESTRATOR_SOURCE_GUID>) already uses one placeholder per value.

Use <FROM_TIMESTAMP> / <TO_TIMESTAMP> for the seven affected examples in
audit-commands.md and audit-workflow-guide.md, and reword the events-date
gotcha so it explains the midnight expansion instead of spelling it out
against a placeholder.

The literal T23:59:59Z on the login-history examples carried the
end-of-day rule; state it in prose there so the guidance survives.

Add the rule to both guideline files: give each value one placeholder
covering the whole value, and state the expected precision in prose.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@Mihaiii Mihaiii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved based on what a client requested, although imo there wasn't any PII concern and the new format is less useful than the old one for the model.

@RaduAna-Maria
RaduAna-Maria merged commit d30097f into main Sep 10, 2026
36 of 37 checks passed
@RaduAna-Maria
RaduAna-Maria deleted the docs/placeholder-example-values branch September 10, 2026 14:18
@RaduAna-Maria

Copy link
Copy Markdown
Collaborator Author

/cherry-pick release/v1.202

@github-actions

Copy link
Copy Markdown
Contributor

A cherry pick from this PR targeting release/v1.202 was triggered.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Cherry-pick to release/v1.202 succeeded: #3203

RaduAna-Maria added a commit that referenced this pull request Sep 10, 2026
…3201) (#3203)

* docs: use placeholders for example values that trip content scanners

A customer content-inspection gate blocked the published package on 21
findings. All were false positives on documentation examples — no
credential, live PII, or cardholder data exists in the repo — but a
shape-based gate cannot tell the difference, and a blocked artifact
blocks the rollout either way.

Replace the literal example values we control with the repo's existing
<UPPER_SNAKE_CASE> placeholder convention, which identity-commands.md and
the audit guides already use:

- uipath-admin: literal --expiration dates and audit export date ranges
  become <EXPIRATION_DATE> / <FROM_DATE> / <TO_DATE>; generated folder
  names become audit_<from>_<to>_<generatedAt>. Both audit references are
  now free of literal calendar dates, so the scoping question does not
  come back on the next scan.
- uipath-rpa: mail-merge sample data becomes <COMPANY_NAME> /
  <STREET_ADDRESS> / <CONTACT_NAME> / <PHONE_NUMBER>; the placeholder GUID
  drops its digit runs; the regex reference table masks digit positions as
  N with a note; the "number too long" test row describes its length.

Left verbatim on purpose: Orchestrator error code 170002, two
support-forum thread IDs inside URLs, and a Databricks documentation URL.
Those are product data the playbooks exist to convey, not examples, so
they need an allowlist on the scanning side rather than an edit here.

Document the rule in CONTRIBUTING.md and .claude/rules/content-quality.md
so new examples do not reintroduce the problem.



* docs: use one placeholder per value in audit date examples

<FROM_DATE>T00:00:00Z glued a placeholder to a literal time fragment. It
kept the literal in the file, and read worse than either form alone —
every sibling flag in those same blocks (<USER_GUID>,
<ORCHESTRATOR_SOURCE_GUID>) already uses one placeholder per value.

Use <FROM_TIMESTAMP> / <TO_TIMESTAMP> for the seven affected examples in
audit-commands.md and audit-workflow-guide.md, and reword the events-date
gotcha so it explains the midnight expansion instead of spelling it out
against a placeholder.

The literal T23:59:59Z on the login-history examples carried the
end-of-day rule; state it in prose there so the guidance survives.

Add the rule to both guideline files: give each value one placeholder
covering the whole value, and state the expected precision in prose.



---------

Co-authored-by: RaduAna-Maria <80031810+RaduAna-Maria@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
RaduAna-Maria added a commit that referenced this pull request Sep 18, 2026
…links [PILOT-7612] (#3373)

* docs: clear the remaining content-scan findings without dropping the links

A customer content-inspection scan reported six findings across four
skills. All six are false positives on example text and product
identifiers -- no secret, live PII, or cardholder data is involved --
but the gate matches on shape alone and blocks the whole package.

PR #3201 fixed this class of finding in ten files and deliberately left
three of these behind, arguing the forum thread IDs and the Databricks
docs URL are content rather than examples and need a scanner-side
allowlist. The allowlist never landed and the scan fired again. Each of
those three can drop its matching shape while keeping the reader's
link intact, so they are fixed here rather than deferred again:

- Forum links use Discourse's short `/t/<id>` form. The topic ID is
  preserved, the long slug that put a 10-digit run in front of it is
  gone, and both URLs still resolve (verified HTTP 200).
- The Databricks docsUrl drops `/query`, landing on the same API group
  page. The full path was exactly 40 `[A-Za-z0-9/+=]` characters --
  the AWS secret-key shape, and the only such run in the file.

The other three are example values, replaced per the placeholder rule
in .claude/rules/content-quality.md:

- IXP: a 15-digit float literal illustrating float rounding becomes
  `<SCORE>` described as 15 decimal places.
- Terminal x2: `3000-5000 ms` reads as an 8-digit local phone number;
  written out as `between 3000 and 5000 ms`. That exact string occurs
  nowhere else in the repo, which is what pins it as the trigger.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: point the Databricks docsUrl at the query API, not endpoint management

The previous commit broke the 40-character AWS-secret shape by dropping
/query from the URL, but /api/workspace/servingendpoints and
/api/workspace/servingendpoints/query are two different pages: they
redirect to the serving-endpoint *management* API and the *query* API
respectively. The registry exists to ground an agent on the exact
endpoint before it authors a request, and this entry's own notes
describe the invocations POST -- the query API. Pointing it at CRUD
operations was a regression.

Use the canonical target the original URL already redirected to:
https://docs.databricks.com/api/model-serving-query/v1/query

Same page as the original, resolves 200 with no redirect hop, and the
hyphens in "model-serving-query" break the base64-alphabet run down to
14 characters, so the shape is gone for a different reason than
truncation. No exactly-40 run remains anywhere in the file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
RaduAna-Maria added a commit that referenced this pull request Sep 18, 2026
…opping the links [PILOT-7612] (#3408)

* docs: clear the remaining content-scan findings without dropping the links [PILOT-7612] (#3373)

* docs: clear the remaining content-scan findings without dropping the links

A customer content-inspection scan reported six findings across four
skills. All six are false positives on example text and product
identifiers -- no secret, live PII, or cardholder data is involved --
but the gate matches on shape alone and blocks the whole package.

PR #3201 fixed this class of finding in ten files and deliberately left
three of these behind, arguing the forum thread IDs and the Databricks
docs URL are content rather than examples and need a scanner-side
allowlist. The allowlist never landed and the scan fired again. Each of
those three can drop its matching shape while keeping the reader's
link intact, so they are fixed here rather than deferred again:

- Forum links use Discourse's short `/t/<id>` form. The topic ID is
  preserved, the long slug that put a 10-digit run in front of it is
  gone, and both URLs still resolve (verified HTTP 200).
- The Databricks docsUrl drops `/query`, landing on the same API group
  page. The full path was exactly 40 `[A-Za-z0-9/+=]` characters --
  the AWS secret-key shape, and the only such run in the file.

The other three are example values, replaced per the placeholder rule
in .claude/rules/content-quality.md:

- IXP: a 15-digit float literal illustrating float rounding becomes
  `<SCORE>` described as 15 decimal places.
- Terminal x2: `3000-5000 ms` reads as an 8-digit local phone number;
  written out as `between 3000 and 5000 ms`. That exact string occurs
  nowhere else in the repo, which is what pins it as the trigger.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: point the Databricks docsUrl at the query API, not endpoint management

The previous commit broke the 40-character AWS-secret shape by dropping
/query from the URL, but /api/workspace/servingendpoints and
/api/workspace/servingendpoints/query are two different pages: they
redirect to the serving-endpoint *management* API and the *query* API
respectively. The registry exists to ground an agent on the exact
endpoint before it authors a request, and this entry's own notes
describe the invocations POST -- the query API. Pointing it at CRUD
operations was a regression.

Use the canonical target the original URL already redirected to:
https://docs.databricks.com/api/model-serving-query/v1/query

Same page as the original, resolves 200 with no redirect hop, and the
hyphens in "model-serving-query" break the base64-alphabet run down to
14 characters, so the shape is gone for a different reason than
truncation. No exactly-40 run remains anywhere in the file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: resolve cherry-pick conflict in IXP cli-reference

The cherry-pick of #3373 conflicted on the get-metrics row because
release/v1.202 carries different prose there than main does (the
`Name`-resolution and "any version the backend ever scored" wording,
and Critical Rule 21 rather than 20).

Keep the release branch's text and apply only the change #3373
actually made to this file: the 15-digit float literal illustrating
long-tail rounding becomes `<SCORE>` described as 15 decimal places,
per .claude/rules/content-quality.md. No other line differs from
release/v1.202.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: RaduAna-Maria <80031810+RaduAna-Maria@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants