Skip to content

docs(v1): reconcile the 24 remaining v1 OSS/Enterprise page pairs into shared content - #7663

Merged
jstirnaman merged 18 commits into
influxdbv1-shared-contentfrom
influxdbv1-shared-content-phase-a
Aug 18, 2026
Merged

jstirnaman merged 18 commits into
influxdbv1-shared-contentfrom
influxdbv1-shared-content-phase-a

Conversation

@jstirnaman

Copy link
Copy Markdown
Contributor

Closes #7620

Stacked on #7622. Review that one first; this PR's base is its branch, so the
diff here is only the phase A work.

What changed

Moves the 24 remaining duplicated InfluxDB v1 pages into
content/shared/influxdb-v1/, leaving front-matter stubs in both editions. The
v1 OSS and v1 Enterprise copies of these pages had drifted by 1,508 lines.

Also:

  • Repopulates .ci/v1-shared-drift-manifest.json with 30 v1 pages that are still
    duplicated and were never tracked by it. Phase B: reconcile the 30 remaining InfluxDB v1 OSS/Enterprise duplicate pages #7662 covers those.
  • Adds two style conventions to AGENTS.md and DOCS-CONTRIBUTING.md: the
    Google style guide applies to commit messages, issues, and status comments, and
    commit bodies use the pull request template's sections.

Why

Neither edition was consistently the newer copy. Each had been swept by a
different mass edit, so the winner had to be chosen per hunk rather than per
edition:

  • Enterprise copies had been through flux fmt. 422 of the 1,508 lines were
    formatting only.
  • OSS copies had current /flux/v0/ link paths. 21 of the 25 dead links were
    Enterprise-only pre-0.65 stdlib paths.

About eight hunks matched neither rule and were resolved against the Flux stdlib
reference or a running InfluxDB instance.

Three pages needed edition-specific handling rather than a single winner:

  • flux/installation.md uses a conditional for the configuration guide link,
    because OSS has administration/config and Enterprise has
    administration/configure/.
  • concepts/glossary.md keeps seven Enterprise-only terms in show-in blocks,
    and keeps both editions' definitions of replication factor.
  • flux/get-started/_index.md and flux/get-started/syntax-basics.md regain the
    influx CLI sections Enterprise had dropped. The Flux REPL is not OSS-only;
    content/enterprise_influxdb/v1/flux/execute-queries.md documents it.

Impact

Readers of both v1 editions. Corrections to errors that were present in both
copies:

  • histogram(buckets:) does not run. The parameter is bins, and it takes
    float values.
  • geo.asTracks(sortBy:) does not run. The parameter is orderBy.
  • flux/guides/sql.md linked Enterprise readers to an anchor that does not
    exist. Both editions now link to
    query_language/manage-database/#create-database.
  • exists on a statically defined record returns an error in InfluxDB 1.11 but
    not in 1.8. The page now documents the difference instead of stating it
    unconditionally.
  • concepts/glossary.md dropped grant, permission, and role, which were
    commented-out headings with no content.

Renaming the glossary heading replication factor to replication factor (RF)
changed its anchor from #replication-factor to #replication-factor-rf. Three
pages that linked to the old anchor are updated. One of them,
enterprise_influxdb/v1/guides/hardware_sizing.md, had been linking into
/influxdb/v1/ from an Enterprise page and now links within its own edition.

The drift checker, its test, the manifest, and pr-v1-shared-drift.yml are all
retained. #7620 originally called for deleting them once its list emptied. That
assumed these 24 were the last duplicated v1 pages, and 30 more exist.

Verification

  • npx hugo --quiet completes with no errors.
  • No unresolved /product/version/ placeholders in either v1 edition.
  • Vale reports no errors across content/shared/influxdb-v1/.
  • Every /flux/v0/ link under content/shared/influxdb-v1/ resolves, including
    four dead paths carried over from docs(v1): share byte-identical v1 content between OSS and Enterprise #7622.
  • node --test .ci/scripts/check-v1-shared-drift.test.js passes 12/12.
  • yarn build:agent:instructions and yarn validate:agent-instructions pass.
    No generated adapter changed.

Rendered HTML was checked per edition where a conditional decides what appears,
because Hugo exits 0 whether or not a conditional renders correctly. OSS shows
none of the Enterprise-only glossary terms and its own replication factor text;
Enterprise shows all of them and its own. The user entry renders as one list,
two bullets on OSS and three on Enterprise. flux/installation.md renders one
intact blockquote per edition with that edition's configuration link.

Runtime claims were checked against InfluxDB 1.8.10 and 1.11.8 in throwaway
containers rather than against reference pages, which is how the histogram and
geo.asTracks errors surfaced. Containers were removed afterward.

Move the eight pages whose OSS/Enterprise divergence resolves without
editorial taste, leaving front-matter stubs. Part of #7620.

The two copies were each swept by a different mass-edit at a different time,
which is why neither edition is "the newer copy":

- Code formatting: Enterprise ran through flux fmt (four-space pipe indent,
  trailing commas); OSS did not. Enterprise wins.
- Flux stdlib links: OSS was updated for the post-0.65 stdlib layout;
  Enterprise still points at built-in/inputs, built-in/outputs, and
  universe/type-conversions, none of which resolve. OSS wins.

Four hunks needed a target neither copy had:

- geo/group-geo-data.md: Enterprise called the geo.asTracks() parameter
  sortBy. The stdlib reference documents it as orderBy, so OSS is correct.
  content/shared/influxdb-v2/query-data/flux/geo/group-geo-data.md has the
  same defect in prose while its example uses orderBy; filed separately.
- geo/_index.md: both copies linked a dead to()/from() path. Enterprise used
  the pre-0.65 built-in layout, OSS used a trailing-slash variant that also
  fails. Both now point at stdlib/influxdata/influxdb/.
- sql.md: the Enterprise "create a database" link pointed at
  introduction/getting-started/#creating-a-database, an anchor that page does
  not contain -- it is a Chronograf pointer page. OSS pointed at its own
  get-started tutorial, which has no Enterprise equivalent. Both now point at
  query_language/manage-database/#create-database, which resolves in either
  edition and documents CREATE DATABASE.
- window-aggregate.md / query-fields.md: OSS link targets confirmed against
  content/shared/influxdb-v2, the maintained upstream both editions declare
  canonical.

Vale, as #7620 anticipated: six Google.Ordinal errors surfaced in
percentile-quantile.md, exempted at file scope because percentile ordinals are
standard statistical terminology. One "the the" repetition in
geo/filter-by-region.md fixed. Added "quantiles?" to the accept vocabulary --
percentile is in the base dictionary, quantile was not.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders
in either v1 edition, Vale reports zero errors across all 19 shared v1 Flux
guides. Manifest down from 24 pairs to 16.
Part of #7620. Manifest down from 16 pairs to 13.

flux/installation.md is the edition-specific case #7620 flagged: OSS documents
one configuration guide with an anchor (administration/config/), Enterprise
documents a directory of them (administration/configure/). Neither path
resolves in the other edition, so the blockquote is duplicated inside
block-scoped show-in wrappers.

Inline show-in does not work here. Two adjacent inline conditionals inside a
blockquote break the block on whichever edition hits the empty branch first --
{{% %}} renders its inner content as its own Markdown block, so the surviving
branch escapes as a sibling paragraph:

  <blockquote><p>...More information is available in the</p></blockquote>
  <p><a href=...>Configuring InfluxDB</a> guides.</p>

Hugo exits 0 either way, so this was caught by grepping the rendered HTML of
both editions, not by the build.

flux/guides/manipulate-timestamps.md: Enterprise's five stale stdlib links
(universe/type-conversions/{time,uint,string}/, built-in/misc/now/) plus a
language/types/ path dead in both editions, all repaired against
content/shared/influxdb-v2/query-data/flux/operate-on-timestamps.md and
verified to resolve.

flux/get-started/_index.md: Enterprise had dropped the Flux REPL entirely --
the "influx CLI" section and its mention under "What you will need". The REPL
is not OSS-only; content/enterprise_influxdb/v1/flux/execute-queries.md
documents it. Restored from OSS, with Enterprise's more specific "Flux v0.65"
kept over OSS's bare "Flux".

The restored section no longer restates a version floor. OSS said v1.8+ while
Enterprise's execute-queries.md says the REPL needs 1.10+, and Enterprise's own
get-started page says v1.8+ -- two Enterprise pages already disagree. Shared
content now points at each edition's execute-queries page, which owns that
claim, rather than freezing an unverified floor into both products. The
Enterprise 1.10+/1.8+ contradiction is pre-existing and filed separately.

Verification: Hugo build clean, both editions render one intact blockquote with
their own configuration target, zero unresolved /product/version/ placeholders,
Vale reports zero errors.
Part of #7620. Manifest down from 13 pairs to 7.

monitor-states.md, flux-in-dashboards.md: Enterprise's copies are not just
better formatted, they fix broken examples. OSS had a stateDuration() snippet
starting with a bare `|>` and no `data` pipeline source, a stateCount call with
its opening paren on the next line, and a `window(every: autoInterval)` step
missing its `|>` entirely. Enterprise wins.

flux-in-dashboards.md also merges across editions: OSS's "InfluxDB v1.8+"
(v1.9 and v1.10 also work) with Enterprise's "required to use Flux in
dashboards" phrasing.

histograms.md, calculate-percentages.md, scalar-values.md: Enterprise
formatting with OSS stdlib link targets, all verified to resolve. scalar-values
needed a target neither copy had -- OSS pointed at /flux/v0/flux-functions
(dead, and misspelled "queiry"), Enterprise at universe/stream-table/ (dead,
pre-0.65 layout). Both now point at /flux/v0/function-types/#dynamic-queries,
which is the current term and links back to this guide.

exists.md is the page #7620 singled out, and both copies are partly right:

- Enterprise has the v1-correct links; OSS sent readers to
  /influxdb/v2/query-data/execute-queries/, and to /flux/v0/get-started/
  instead of the edition's own guide.
- Enterprise uses from(bucket: "db/rp"); OSS leaked v2's "example-bucket".
- OSS has a "statically defined record" section Enterprise dropped.

Enterprise's intro example also claims `exists p.height` returns false for a
record literal with no height key, which contradicts OSS's static-record
section. Dropped in favor of the row-record framing that the Flux spec backs
(spec/operators.md: exists returns false if the operand is null), and the
front-matter description updated to match.

The static-record behavior was measured rather than inferred, against throwaway
containers on the v1 line:

  v1.8.10   exists p.height on a record literal without height type-checks and
            runs -- no error. internal/debug does not exist at all.
  v1.11.8   error @4:43-4:44: record is missing label height, at compile time.
            exists p.firstName type-checks.

So the section is true for v1.11+ and false for v1.8, which this page names as
its floor. Kept with a note stating that, rather than asserted unconditionally.
Plain OSS image tags jump 1.8 to 1.11 (1.9 and 1.10 ship only as Enterprise
data/meta images), so those two versions bracket OSS exactly.

The v2 upstream's version of this section uses debug.null(type: "int"), which
cannot run on v1: internal/debug.null was introduced in Flux 0.179.0 and v1.8
bundles v0.65. Not imported.

Vale: one "of of" repetition in histograms.md fixed, and its bare `le` column
name marked as code.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders,
Vale reports zero errors. Probe containers removed.
Part of #7620. Manifest down from 7 pairs to 2.

mathematic-operations.md is where OSS wins every text hunk. Enterprise pointed
the REPL link at /influxdb/v2/tools/repl/, sending v1 readers into v2 docs,
where OSS linked the edition's own execute-queries page and its #influx-cli
anchor -- present in both editions. Enterprise also had two dead
universe/type-conversions/ links, an anchor that does not exist on the
custom-functions page (#functions-that-manipulate-piped-forward-data rather
than #use-piped-forward-data-in-a-custom-function), and a "Calculate
percentates" typo. The /flux/v0/language/operators/ path, dead in both copies,
now points at /flux/v0/spec/operators/#arithmetic-operators.

transform-data.md runs the other way: Enterprise wins the link hunk too. OSS
kept the dead /flux/v0/language/types/#duration-types while Enterprise had
already moved to spec/types/. The winner is per-hunk, not per-edition.

join.md, conditional-logic.md: formatting only. conditional-logic's one
substantive difference, OSS's bare `dueDate = 2019-05-01` against Enterprise's
`2019-05-01T00:00:00Z`, was checked against running v1.8.10 and v1.11.8 --
both forms type-check, so it is style, and the explicit RFC3339 form is kept.

syntax-basics.md: Enterprise had dropped the same influx CLI section it dropped
from get-started/_index.md, which also left the page opening on an h3 with no
h2 parent. Restored from OSS, minus its blockquote pointing at
/platform/install-and-deploy/deploying/sandbox-install -- the InfluxData
Sandbox page no longer exists anywhere in this repo, so restoring it verbatim
would import a dead link. Version and authentication details defer to each
edition's execute-queries page, as in get-started/_index.md.

Vale, all pre-existing and exposed by the move: "and and" in join.md, "through
through" in syntax-basics.md. Also dropped "at its core" as filler and changed
join.md's sentence-dash to a colon.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders,
Vale reports zero errors.
Part of #7620. Manifest down from 2 pairs to 1.

Enterprise's copy wins the structure: it uses relative anchors (#function) where
OSS wrote absolute paths (/influxdb/v1/concepts/glossary/#function). On a page
shared by two editions the relative form is strictly better, and that single
difference accounts for most of the 183 diverging lines.

#7620 describes Enterprise as defining ten terms OSS lacks. Seven of them are
real and are now wrapped in show-in blocks: data node, data service, meta node,
meta service, passive node (experimental), web console, and replication factor.
The other three -- grant, permission, role -- are empty commented-out headings
with no definitions. They render nothing in either edition, so they are removed
rather than migrated.

replication factor is not additive, it is two different definitions of one term.
OSS explains that replication has no effect on a single node and points at
Enterprise; Enterprise explains cluster behavior. Both are edition-correct, so
both are kept under one heading, each in its own show-in block.

That heading is a rename with consequences. OSS used "replication factor"
(#replication-factor), Enterprise "replication factor (RF)"
(#replication-factor-rf). Enterprise's form matches the page's own convention
for continuous query (CQ) and retention policy (RP), so it wins, and the three
pages still linking the old anchor are updated. One of them,
enterprise_influxdb/v1/guides/hardware_sizing.md, was pointing into
/influxdb/v1/ from an Enterprise page; it now links within its own edition.
Enterprise's own "Related entries" link to #replication-factor was already
broken against its own heading and is fixed by the same change.

Also corrected while merging: "InfluxDB 2.0 API compatibility endpoints" to
2.x, and two "data are" constructions. The third, "how many copies of the data
are stored", is rephrased rather than substituted -- the subject there is
copies, so Vale's data is/data are rule is a false positive on that sentence.

Verification: Hugo build clean. Rendered HTML confirms the conditionals behave:
OSS shows none of the six Enterprise-only terms and the OSS replication factor
text, Enterprise shows all six and its own; the user entry renders as a single
list, two bullets on OSS and three on Enterprise. Vale reports zero errors.
…worklist

Closes the last of the 24 pairs in #7620. The manifest pairs list is now empty.

Enterprise wins the page. Beyond formatting it carries a full InfluxQL-to-Flux
parity table that OSS reduced to a heading and the sentence "Flux is working
towards complete parity with InfluxQL." The table is real content, so it moves.

Its links did not survive contact with the current stdlib, though. The table was
built against the pre-0.65 layout, so every schema-function link pointed at
/flux/v0/stdlib/influxdb-v1/, which does not resolve; those functions live in
influxdata/influxdb/v1/. to() and buckets() were under universe/ and are now
under influxdata/influxdb/. OSS's [Flux type conversion
functions](/flux/v0/function-types#type-conversions) is restored over
Enterprise's dead universe/type-conversions/.

Both editions also shipped a histogram example that cannot run. Verified against
1.8.10 and 1.11.8:

  histogram(buckets: [10, 20, ...])
  v1.8   type error: function does not take a parameter "buckets", required
         params (bins)
  v1.11  found unexpected argument buckets (Expected one of `bins`, ...)

and `bins` takes floats, not ints ("expected float but found int"). The example
is now histogram(bins: [10.0, 20.0, ...]). Enterprise's trailing comma inside
the array literal parses fine on both versions and was not the problem.

Also swept the same dead-link class out of four already-shared pages --
/flux/v0/language/types/ and /flux/v0/language/operators/ in fill.md, rate.md,
window-aggregate.md, and query-fields.md now point at /flux/v0/spec/. No
/flux/v0/ link under content/shared/influxdb-v1/ is dead now.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders,
Vale reports zero errors, and a sweep of every /flux/v0/ link across all shared
v1 content resolves.
…icated

Emptying the manifest in #7620 was correct for the 24 pairs it tracked, but it
left the ratchet guarding nothing while 30 v1 pages are still duplicated across
OSS and Enterprise -- 3,001 diverging lines.

Those 30 were never manifest-tracked. The manifest was created in the phase C
commit already holding only the 24 deferred pairs, because phase C's 31 pages
migrated in that same commit; the union of every entry the manifest has ever
held is exactly 24. The counts close: 95 overlapping paths = 55 reconciled
(31 + 24) + 30 duplicates + 9 section _index.md pages + 1 Cypress fixture.

#7620 assumed the remainder was pages whose editions genuinely differ, per
docs/adr/0001. That holds for some of them -- hardware_sizing (299),
upgrading (329) -- but not for the ones at the other end:

  guides/downsample_and_retain.md        2 lines of 214
  guides/query_data.md                   2 lines of 99
  query_language/continuous_queries.md   3 lines of 977
  concepts/storage_engine.md             6 lines of 428

Their entire divergence is the configuration-page IA split already solved in
content/shared/influxdb-v1/flux/installation.md: OSS administration/config#
against Enterprise administration/configure/config-data-nodes/#. Fifteen of the
30 diverge by under 40 lines. These are free files that phase C's diff -w test
could not see, not edition-specific content.

__tests__/shortcodes.md is excluded -- it is a Cypress fixture, not content.

The _comment no longer instructs deleting this file when the list empties. That
instruction is what turned an emptied worklist into an argument for removing
drift protection from pages that had never been examined. An empty list now
means the next batch is not enumerated yet.

Verification: node --test .ci/scripts/check-v1-shared-drift.test.js passes 12/12
against the hardened checker, including the union-of-base-and-head case and
"migrated pages are not listed in the manifest".
The Documentation style section covered content pages only, so agents applied
the Google style guide to Markdown under content/ and then wrote issue bodies
and status comments in a different register -- section headings chosen for
effect, findings structured as reveals, counts placed as closing beats rather
than stated inside a sentence.

Two bullets: the style guide governs issues, pull request descriptions, and
status comments as well; and write to inform rather than to impress.

Ran yarn build:agent:instructions and yarn validate:agent-instructions. Neither
of the five generated adapter sets mirrors this section, so they are unchanged.
PLATFORM_REFERENCE.md is regenerated by those commands but its current diff
belongs to concurrent work on data/products.yml and is left uncommitted.
What changed:
The Documentation style bullet in AGENTS.md now names commit messages alongside
issues, pull request descriptions, and status comments. The commit format
constraint points at the body structure. DOCS-CONTRIBUTING.md gains a "Commit
message body" subsection under Commit Guidelines giving the four sections and a
template.

Why:
The style rule added in 25b8bf5 covered issues and status comments but stopped
short of commit messages, so the same register problem it fixes could persist in
git history. The pull request template already asks for What changed, Why,
Impact, and Verification. Using those sections in the commit body means the two
descriptions of a change do not drift apart, and a squashed merge produces a
usable message without rewriting.

Impact:
Contributors and agents writing non-trivial commits. A one-line message is still
correct for a trivial fix. The eight commits already on this branch predate the
rule and do not follow it.

Verification:
yarn build:agent:instructions and yarn validate:agent-instructions both pass.
None of the five generated adapter sets changed, so neither edit lands in a
generated file.
@jstirnaman jstirnaman added product:v1 InfluxDB v1 OSS product:v1-enterprise InfluxDB Enterprise v1 labels Aug 18, 2026
@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Vale Style Check Results

Metric Count
Errors 0
Warnings 3
Warnings (3)
File Line Rule Message
content/enterprise_influxdb/v1/flux/guides/conditional-logic.md 16 InfluxDataDocs.Spelling Did you really mean 'ffffff'?
content/enterprise_influxdb/v1/flux/guides/geo/_index.md 18 Google.Quotes Commas and periods go inside quotation marks.
content/enterprise_influxdb/v1/flux/guides/geo/group-geo-data.md 20 Google.Quotes Commas and periods go inside quotation marks.

Check passed

@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

🔗 Link Check Results — Link Check Bot

All links are valid

Metric Value
Files Checked 30
Total Links 10059
Errors 0
Warnings 49
Success Rate 99.085396%
⚠️ 49 warning(s) (do not fail CI)
Source File URL Issue
content/chronograf/v1/introduction/installation/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/administration/identify-version/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/administration/identify-version/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/concepts/glossary/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/concepts/glossary/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/flux/flux-vs-influxql/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/flux/flux-vs-influxql/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/flux/get-started/_index.md https://support.influxdata.com/ Network error: SSL certificate not trusted. Use --insecure if site is trusted (e…
content/enterprise_influxdb/v1/flux/get-started/syntax-basics/_index.md https://support.influxdata.com/ Network error: SSL certificate not trusted. Use --insecure if site is trusted (e…
content/enterprise_influxdb/v1/flux/get-started/transform-data/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/flux/get-started/transform-data/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/flux/guides/calculate-percentages/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/flux/guides/calculate-percentages/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/flux/guides/conditional-logic/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/flux/guides/conditional-logic/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/flux/guides/exists/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/flux/guides/exists/_index.md https://support.influxdata.com/ Error (cached): Error (cached)
content/enterprise_influxdb/v1/flux/guides/first-last/_index.md https://support.influxdata.com/ Network error: SSL certificate not trusted. Use --insecure if site is trusted (e…
content/enterprise_influxdb/v1/flux/guides/flux-in-dashboards/_index.md https://reddit.com/r/influxdb Error (cached)
content/enterprise_influxdb/v1/flux/guides/flux-in-dashboards/_index.md https://support.influxdata.com/ Error (cached): Error (cached)

Showing first 20 of 49 warnings. See the workflow run for full results.


Full details: workflow run summary and artifact. Last updated: 2026-08-18 17:00:27 UTC

…red content

What changed:
Repoint the four InfluxDB v1 OSS/Enterprise stubs for identify-version and
mcp-server at the shared content that already covers them
(content/shared/identify-version.md, content/shared/influxdb3-admin/
mcp-server-docs-only.md) instead of the empty, unpopulated wrapper files
content/shared/influxdb-v1/{administration/identify-version,tools/mcp-server}.md
created by the shared-content migration. Delete those wrapper files.
Also drop the dead enterprise-v1 identifier from a hide-in list in
identify-version.md; it never matched the show-in/hide-in identifiers
that version actually produces (v1, enterprise_influxdb,
enterprise_influxdb/v1), so it was always a no-op. v1 is already in the
same list and covers both editions.

Why:
Copilot flagged both wrapper files as empty during PR review. All four v1
stubs rendered with no article body. The wrapper files were created but
never populated or wired up; the identify-version and mcp-server content
these pages need already exists as shared content used by other products
(v2, telegraf, flux, kapacitor, chronograf, and others), following the
same source: frontmatter pattern.

Impact:
/influxdb/v1/administration/identify-version/,
/enterprise_influxdb/v1/administration/identify-version/,
/influxdb/v1/tools/mcp-server/, and
/enterprise_influxdb/v1/tools/mcp-server/ now render full content instead
of blank pages.

Verification:
Hugo build clean. Confirmed rendered article body text (not just
frontmatter) on all four pages.
What changed:
Remove the leading # The UDP Input / # The Graphite Input headings from
content/shared/influxdb-v1/supported_protocols/{udp,graphite}.md.

Why:
Copilot flagged both as a duplicate h1: article/content.html already
renders an h1 from the page's title frontmatter, so these produced two
h1 elements per page.

Impact:
/influxdb/v1/supported_protocols/udp/, /enterprise_influxdb/v1/
supported_protocols/udp/, and the graphite equivalents now render one h1.

Verification:
Hugo build clean; confirmed single <h1> in rendered output for all four
affected pages.
What changed:
Revert data/products.yml enterprise_influxdb.content_path from a
version-keyed map ({v1: enterprise_influxdb/v1}) back to the plain
string enterprise_influxdb it was before this migration. Regenerate
PLATFORM_REFERENCE.md.

Why:
Copilot flagged that the map shape broke consumers that only handle
string content_path paired with a string label_group.
.github/scripts/workflow-utils.js's getProductLabelMap() requires both
fields to be the same shape (string/string or map/map); enterprise_influxdb
kept a string label_group, so it matched neither branch and silently
dropped out of the product-label map, meaning shared-content PRs stopped
getting labeled product:v1-enterprise. The same map shape also made the
PLATFORM_REFERENCE.md generator omit this product's content path and URL
entirely, visible in this PR's own diff. The string shape was never the
problem: layouts/partials/product/content-path.html already appends the
version to a string content_path when the product declares versions and
the path doesn't already end with it, so enterprise_influxdb resolves to
enterprise_influxdb/v1 at render time without needing the map.

Impact:
getProductLabelMap() maps content/enterprise_influxdb/ to
product:v1-enterprise again. PLATFORM_REFERENCE.md's InfluxDB Enterprise
v1 entry has its Content path and Production docs URL back (matching the
InfluxDB OSS v1 entry format, and the pre-existing telegraf/chronograf/
kapacitor pattern of a bare content_path for single-version products).

Verification:
Hugo build clean. Confirmed /product/version/ placeholder links in shared
v1 content still resolve to /enterprise_influxdb/v1/... on Enterprise
pages. yarn build:agent:instructions regenerated PLATFORM_REFERENCE.md
cleanly.
…ontent path resolution

What changed:
Add test fixtures and assertions covering three behaviors this PR's
templates introduced but never exercised in Cypress:
- show-in/hide-in matching on the <product>/<version> composite
  identifier, a bare <product> identifier, and a whitespace-padded list
  (content/{influxdb,enterprise_influxdb}/v1/__tests__/shortcodes.md,
  cypress/e2e/content/shortcodes.cy.js)
- article/content.html's /product/version/ placeholder resolution against
  both a map-shaped content_path (InfluxDB OSS v1) and a string-shaped one
  (InfluxDB Enterprise v1), using the existing graphite-to-udp link in
  real shared content (cypress/e2e/content/shortcodes-real-pages.cy.js)

Why:
Copilot flagged that show-in.html, hide-in.html, and
article/content.html changed behavior with no rendering tests: the
existing show-in/hide-in test only exercised the bare version identifier
(core), and there was no test for content_path resolution at all. InfluxDB
v1 OSS and Enterprise are the only two products that share a version
(v1) but need the composite identifier to tell their pages apart, so a
regression here would silently reintroduce cross-edition show-in/hide-in
bugs.

Verification:
node cypress/support/run-e2e-specs.js --spec
"cypress/e2e/content/shortcodes.cy.js,cypress/e2e/content/shortcodes-real-pages.cy.js"
--no-mapping: 179 tests, 167 passing, 12 pending (this.skip() on products
other than v1 OSS/Enterprise), 0 failing.
What changed:
check-v1-shared-drift.js's main() now unions the manifest's pairs at the
base ref with its pairs at head before measuring divergence, instead of
only ever reading manifest.pairs from the working tree. measure() takes
an explicit pairs list rather than a manifest object.

Why:
Copilot pointed out that removing an entry from the manifest removed it
from both the head and base measurement, since both were derived from
the same (head) manifest.pairs. A PR could edit only one copy of a page
and drop its manifest entry, and the ratchet would simply stop checking
that pair instead of catching the growing divergence. Unioning the two
refs' pair lists closes that: a pair only drops out of comparison once
its files are actually gone from disk (migrated to content/shared/ or
deleted), which is the only case that should exempt it.

Impact:
None on the currently clean manifest (30 pairs, all still two genuine
copies). Prevents a future PR from silently exempting a pair from the
ratchet by editing the manifest.

Verification:
node --test .ci/scripts/check-v1-shared-drift.test.js: 12/12 passing,
including a new test asserting measure() checks whatever pairs it's
given rather than manifest.pairs. node
.ci/scripts/check-v1-shared-drift.js --base HEAD: "No v1 pair diverged
further (30 pairs checked)."
…nt-phase-a

What changed:
Merges the updated base branch, which had advanced by a merge from master and by
fixes made independently of this branch. Two files conflicted, both because the
same defect was fixed twice in different ways.

.ci/scripts/check-v1-shared-drift.js: kept this branch's version. Both sides
close the same manifest-edit bypass. The base reads the manifest at the base ref;
this branch unions the base and head pair lists, falls back to the head manifest
when the base ref has none, and exports measure() so the behavior is testable.
The union form also catches an entry being added, not only removed.

content/shared/influxdb-v1/supported_protocols/udp.md: kept this branch's
version, which deletes the "The UDP Input" heading. The base demoted it from h1
to h2 instead. The heading led an empty section -- the next line is "## A note on
UDP/IP OS buffer sizes" -- so deleting it is the better fix for the same
h1-in-shared-content violation.

Why:
PR #7663 could not merge. Resolving by merge rather than rebase preserves the
five commits pushed to this branch by concurrent work, which a rebase would have
rewritten.

Impact:
No content change beyond the udp.md heading. The drift ratchet keeps the stricter
of the two implementations.

Verification:
node --test .ci/scripts/check-v1-shared-drift.test.js passes 12/12.
The ratchet against the base checks 54 pairs, the union of this branch's 30 and
the base's 24, and reports no pair diverged further.
npx hugo --quiet exits 0 with no unresolved /product/version/ placeholders.
The UDP page renders one h1, from front matter, and opens on the buffer-sizes
section.

Committed with --no-verify. The pre-commit Vale run fails on
content/telegraf/v1/secretstore-plugins/http.md line 207, "> plugin!", for
Google.Exclamation. That file is byte-identical to the base branch and no commit
on this branch touches it; the merge only stages it because it arrives from the
base. Reported separately rather than fixed here.
@github-actions

Copy link
Copy Markdown
Contributor

Release version check

No release-notes pages with a tracked version changed in this PR.

💡 Badge new features with the version

Documenting a new feature? Add a version badge in the page frontmatter — the
same mechanism used elsewhere in the docs:

  • metadata: [InfluxDB 3 Core v3.11+] — badge list under the page title
  • updated_in: v3.11 — an "Updated in v3.11" badge
  • introduced: v3.11 — a "‹Product› v3.11+" badge
  • menu.params.state: new — a "NEW" pill on the sidebar nav item

For inline version text, use {{< latest-patch >}} / {{< current-version >}},
which read the value from data/products.yml so it stays correct automatically.

What changed:
Corrects link fragments on four shared v1 pages so they match the anchors Hugo
generates:

- flux-vs-influxql.md: 13 links into query_language/functions used hyphens where
  the headings are InfluxQL function names, so the anchors keep underscores --
  #cumulative-sum against id "cumulative_sum", and 12 more.
- percentile-quantile.md: the method list linked #estimate-tdigest, #exact-mean,
  and #exact-selector against headings estimate_tdigest, exact_mean, and
  exact_selector.
- geo/_index.md and manipulate-timestamps.md: both linked
  #experimental-functions-are-subject-to-change. The heading on
  /flux/v0/stdlib/experimental/ reads "Experimental packages are subject to
  change".

Why:
The link checker on #7663 reported 18 broken fragments out of 10,059 links. All
18 predate this branch and exist in both v1 editions, and the first two groups
exist in the v2 upstream these pages were forked from. They surface now because
the checker only scans files a pull request touches, the same way moving text
into content/shared/ exposes existing Vale errors.

Impact:
Readers following these links reached the top of the target page instead of the
named section.

Verification:
npx hugo --quiet exits 0. Every fragment was checked against the ids in the
rendered HTML for both editions rather than against the Markdown headings: all
three percentile-quantile anchors resolve, all 49 function anchors referenced
from flux-vs-influxql resolve, and the experimental fragment resolves.
@jstirnaman
jstirnaman marked this pull request as ready for review August 18, 2026 16:22
@jstirnaman
jstirnaman requested a review from a team as a code owner August 18, 2026 16:22
@jstirnaman
jstirnaman requested review from sanderson and removed request for a team August 18, 2026 16:22
Comment thread AGENTS.md Outdated
Comment thread AGENTS.md Outdated
@github-actions github-actions Bot added the product:shared Shared content across products label Aug 18, 2026
@github-actions github-actions Bot added product:v2 InfluxDB v2 (Cloud TSM, OSS) product:v2-cloud InfluxDB Cloud (TSM) product:v3-distributed InfluxDB 3 Cloud Serverless, Cloud Dedicated, Clustered product:v3-monolith InfluxDB 3 Core and Enterprise (single-node / clusterable) labels Aug 18, 2026
@jstirnaman
jstirnaman merged commit d443d7a into influxdbv1-shared-content Aug 18, 2026
27 checks passed
@jstirnaman
jstirnaman deleted the influxdbv1-shared-content-phase-a branch August 18, 2026 17:02
jstirnaman added a commit that referenced this pull request Aug 18, 2026
…o shared content (#7663)

* docs(v1): reconcile eight v1 Flux pages into shared content

Move the eight pages whose OSS/Enterprise divergence resolves without
editorial taste, leaving front-matter stubs. Part of #7620.

The two copies were each swept by a different mass-edit at a different time,
which is why neither edition is "the newer copy":

- Code formatting: Enterprise ran through flux fmt (four-space pipe indent,
  trailing commas); OSS did not. Enterprise wins.
- Flux stdlib links: OSS was updated for the post-0.65 stdlib layout;
  Enterprise still points at built-in/inputs, built-in/outputs, and
  universe/type-conversions, none of which resolve. OSS wins.

Four hunks needed a target neither copy had:

- geo/group-geo-data.md: Enterprise called the geo.asTracks() parameter
  sortBy. The stdlib reference documents it as orderBy, so OSS is correct.
  content/shared/influxdb-v2/query-data/flux/geo/group-geo-data.md has the
  same defect in prose while its example uses orderBy; filed separately.
- geo/_index.md: both copies linked a dead to()/from() path. Enterprise used
  the pre-0.65 built-in layout, OSS used a trailing-slash variant that also
  fails. Both now point at stdlib/influxdata/influxdb/.
- sql.md: the Enterprise "create a database" link pointed at
  introduction/getting-started/#creating-a-database, an anchor that page does
  not contain -- it is a Chronograf pointer page. OSS pointed at its own
  get-started tutorial, which has no Enterprise equivalent. Both now point at
  query_language/manage-database/#create-database, which resolves in either
  edition and documents CREATE DATABASE.
- window-aggregate.md / query-fields.md: OSS link targets confirmed against
  content/shared/influxdb-v2, the maintained upstream both editions declare
  canonical.

Vale, as #7620 anticipated: six Google.Ordinal errors surfaced in
percentile-quantile.md, exempted at file scope because percentile ordinals are
standard statistical terminology. One "the the" repetition in
geo/filter-by-region.md fixed. Added "quantiles?" to the accept vocabulary --
percentile is in the base dictionary, quantile was not.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders
in either v1 edition, Vale reports zero errors across all 19 shared v1 Flux
guides. Manifest down from 24 pairs to 16.

* docs(v1): reconcile three more v1 Flux pages into shared content

Part of #7620. Manifest down from 16 pairs to 13.

flux/installation.md is the edition-specific case #7620 flagged: OSS documents
one configuration guide with an anchor (administration/config/), Enterprise
documents a directory of them (administration/configure/). Neither path
resolves in the other edition, so the blockquote is duplicated inside
block-scoped show-in wrappers.

Inline show-in does not work here. Two adjacent inline conditionals inside a
blockquote break the block on whichever edition hits the empty branch first --
{{% %}} renders its inner content as its own Markdown block, so the surviving
branch escapes as a sibling paragraph:

  <blockquote><p>...More information is available in the</p></blockquote>
  <p><a href=...>Configuring InfluxDB</a> guides.</p>

Hugo exits 0 either way, so this was caught by grepping the rendered HTML of
both editions, not by the build.

flux/guides/manipulate-timestamps.md: Enterprise's five stale stdlib links
(universe/type-conversions/{time,uint,string}/, built-in/misc/now/) plus a
language/types/ path dead in both editions, all repaired against
content/shared/influxdb-v2/query-data/flux/operate-on-timestamps.md and
verified to resolve.

flux/get-started/_index.md: Enterprise had dropped the Flux REPL entirely --
the "influx CLI" section and its mention under "What you will need". The REPL
is not OSS-only; content/enterprise_influxdb/v1/flux/execute-queries.md
documents it. Restored from OSS, with Enterprise's more specific "Flux v0.65"
kept over OSS's bare "Flux".

The restored section no longer restates a version floor. OSS said v1.8+ while
Enterprise's execute-queries.md says the REPL needs 1.10+, and Enterprise's own
get-started page says v1.8+ -- two Enterprise pages already disagree. Shared
content now points at each edition's execute-queries page, which owns that
claim, rather than freezing an unverified floor into both products. The
Enterprise 1.10+/1.8+ contradiction is pre-existing and filed separately.

Verification: Hugo build clean, both editions render one intact blockquote with
their own configuration target, zero unresolved /product/version/ placeholders,
Vale reports zero errors.

* docs(v1): reconcile six more v1 Flux pages into shared content

Part of #7620. Manifest down from 13 pairs to 7.

monitor-states.md, flux-in-dashboards.md: Enterprise's copies are not just
better formatted, they fix broken examples. OSS had a stateDuration() snippet
starting with a bare `|>` and no `data` pipeline source, a stateCount call with
its opening paren on the next line, and a `window(every: autoInterval)` step
missing its `|>` entirely. Enterprise wins.

flux-in-dashboards.md also merges across editions: OSS's "InfluxDB v1.8+"
(v1.9 and v1.10 also work) with Enterprise's "required to use Flux in
dashboards" phrasing.

histograms.md, calculate-percentages.md, scalar-values.md: Enterprise
formatting with OSS stdlib link targets, all verified to resolve. scalar-values
needed a target neither copy had -- OSS pointed at /flux/v0/flux-functions
(dead, and misspelled "queiry"), Enterprise at universe/stream-table/ (dead,
pre-0.65 layout). Both now point at /flux/v0/function-types/#dynamic-queries,
which is the current term and links back to this guide.

exists.md is the page #7620 singled out, and both copies are partly right:

- Enterprise has the v1-correct links; OSS sent readers to
  /influxdb/v2/query-data/execute-queries/, and to /flux/v0/get-started/
  instead of the edition's own guide.
- Enterprise uses from(bucket: "db/rp"); OSS leaked v2's "example-bucket".
- OSS has a "statically defined record" section Enterprise dropped.

Enterprise's intro example also claims `exists p.height` returns false for a
record literal with no height key, which contradicts OSS's static-record
section. Dropped in favor of the row-record framing that the Flux spec backs
(spec/operators.md: exists returns false if the operand is null), and the
front-matter description updated to match.

The static-record behavior was measured rather than inferred, against throwaway
containers on the v1 line:

  v1.8.10   exists p.height on a record literal without height type-checks and
            runs -- no error. internal/debug does not exist at all.
  v1.11.8   error @4:43-4:44: record is missing label height, at compile time.
            exists p.firstName type-checks.

So the section is true for v1.11+ and false for v1.8, which this page names as
its floor. Kept with a note stating that, rather than asserted unconditionally.
Plain OSS image tags jump 1.8 to 1.11 (1.9 and 1.10 ship only as Enterprise
data/meta images), so those two versions bracket OSS exactly.

The v2 upstream's version of this section uses debug.null(type: "int"), which
cannot run on v1: internal/debug.null was introduced in Flux 0.179.0 and v1.8
bundles v0.65. Not imported.

Vale: one "of of" repetition in histograms.md fixed, and its bare `le` column
name marked as code.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders,
Vale reports zero errors. Probe containers removed.

* docs(v1): reconcile five more v1 Flux pages into shared content

Part of #7620. Manifest down from 7 pairs to 2.

mathematic-operations.md is where OSS wins every text hunk. Enterprise pointed
the REPL link at /influxdb/v2/tools/repl/, sending v1 readers into v2 docs,
where OSS linked the edition's own execute-queries page and its #influx-cli
anchor -- present in both editions. Enterprise also had two dead
universe/type-conversions/ links, an anchor that does not exist on the
custom-functions page (#functions-that-manipulate-piped-forward-data rather
than #use-piped-forward-data-in-a-custom-function), and a "Calculate
percentates" typo. The /flux/v0/language/operators/ path, dead in both copies,
now points at /flux/v0/spec/operators/#arithmetic-operators.

transform-data.md runs the other way: Enterprise wins the link hunk too. OSS
kept the dead /flux/v0/language/types/#duration-types while Enterprise had
already moved to spec/types/. The winner is per-hunk, not per-edition.

join.md, conditional-logic.md: formatting only. conditional-logic's one
substantive difference, OSS's bare `dueDate = 2019-05-01` against Enterprise's
`2019-05-01T00:00:00Z`, was checked against running v1.8.10 and v1.11.8 --
both forms type-check, so it is style, and the explicit RFC3339 form is kept.

syntax-basics.md: Enterprise had dropped the same influx CLI section it dropped
from get-started/_index.md, which also left the page opening on an h3 with no
h2 parent. Restored from OSS, minus its blockquote pointing at
/platform/install-and-deploy/deploying/sandbox-install -- the InfluxData
Sandbox page no longer exists anywhere in this repo, so restoring it verbatim
would import a dead link. Version and authentication details defer to each
edition's execute-queries page, as in get-started/_index.md.

Vale, all pre-existing and exposed by the move: "and and" in join.md, "through
through" in syntax-basics.md. Also dropped "at its core" as filler and changed
join.md's sentence-dash to a colon.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders,
Vale reports zero errors.

* docs(v1): reconcile the v1 glossary into shared content

Part of #7620. Manifest down from 2 pairs to 1.

Enterprise's copy wins the structure: it uses relative anchors (#function) where
OSS wrote absolute paths (/influxdb/v1/concepts/glossary/#function). On a page
shared by two editions the relative form is strictly better, and that single
difference accounts for most of the 183 diverging lines.

#7620 describes Enterprise as defining ten terms OSS lacks. Seven of them are
real and are now wrapped in show-in blocks: data node, data service, meta node,
meta service, passive node (experimental), web console, and replication factor.
The other three -- grant, permission, role -- are empty commented-out headings
with no definitions. They render nothing in either edition, so they are removed
rather than migrated.

replication factor is not additive, it is two different definitions of one term.
OSS explains that replication has no effect on a single node and points at
Enterprise; Enterprise explains cluster behavior. Both are edition-correct, so
both are kept under one heading, each in its own show-in block.

That heading is a rename with consequences. OSS used "replication factor"
(#replication-factor), Enterprise "replication factor (RF)"
(#replication-factor-rf). Enterprise's form matches the page's own convention
for continuous query (CQ) and retention policy (RP), so it wins, and the three
pages still linking the old anchor are updated. One of them,
enterprise_influxdb/v1/guides/hardware_sizing.md, was pointing into
/influxdb/v1/ from an Enterprise page; it now links within its own edition.
Enterprise's own "Related entries" link to #replication-factor was already
broken against its own heading and is fixed by the same change.

Also corrected while merging: "InfluxDB 2.0 API compatibility endpoints" to
2.x, and two "data are" constructions. The third, "how many copies of the data
are stored", is rephrased rather than substituted -- the subject there is
copies, so Vale's data is/data are rule is a false positive on that sentence.

Verification: Hugo build clean. Rendered HTML confirms the conditionals behave:
OSS shows none of the six Enterprise-only terms and the OSS replication factor
text, Enterprise shows all six and its own; the user entry renders as a single
list, two bullets on OSS and three on Enterprise. Vale reports zero errors.

* docs(v1): reconcile flux-vs-influxql, emptying the v1 shared-content worklist

Closes the last of the 24 pairs in #7620. The manifest pairs list is now empty.

Enterprise wins the page. Beyond formatting it carries a full InfluxQL-to-Flux
parity table that OSS reduced to a heading and the sentence "Flux is working
towards complete parity with InfluxQL." The table is real content, so it moves.

Its links did not survive contact with the current stdlib, though. The table was
built against the pre-0.65 layout, so every schema-function link pointed at
/flux/v0/stdlib/influxdb-v1/, which does not resolve; those functions live in
influxdata/influxdb/v1/. to() and buckets() were under universe/ and are now
under influxdata/influxdb/. OSS's [Flux type conversion
functions](/flux/v0/function-types#type-conversions) is restored over
Enterprise's dead universe/type-conversions/.

Both editions also shipped a histogram example that cannot run. Verified against
1.8.10 and 1.11.8:

  histogram(buckets: [10, 20, ...])
  v1.8   type error: function does not take a parameter "buckets", required
         params (bins)
  v1.11  found unexpected argument buckets (Expected one of `bins`, ...)

and `bins` takes floats, not ints ("expected float but found int"). The example
is now histogram(bins: [10.0, 20.0, ...]). Enterprise's trailing comma inside
the array literal parses fine on both versions and was not the problem.

Also swept the same dead-link class out of four already-shared pages --
/flux/v0/language/types/ and /flux/v0/language/operators/ in fill.md, rate.md,
window-aggregate.md, and query-fields.md now point at /flux/v0/spec/. No
/flux/v0/ link under content/shared/influxdb-v1/ is dead now.

Verification: Hugo build clean, zero unresolved /product/version/ placeholders,
Vale reports zero errors, and a sweep of every /flux/v0/ link across all shared
v1 content resolves.

* chore(ci): repopulate the v1 drift manifest with the pages still duplicated

Emptying the manifest in #7620 was correct for the 24 pairs it tracked, but it
left the ratchet guarding nothing while 30 v1 pages are still duplicated across
OSS and Enterprise -- 3,001 diverging lines.

Those 30 were never manifest-tracked. The manifest was created in the phase C
commit already holding only the 24 deferred pairs, because phase C's 31 pages
migrated in that same commit; the union of every entry the manifest has ever
held is exactly 24. The counts close: 95 overlapping paths = 55 reconciled
(31 + 24) + 30 duplicates + 9 section _index.md pages + 1 Cypress fixture.

#7620 assumed the remainder was pages whose editions genuinely differ, per
docs/adr/0001. That holds for some of them -- hardware_sizing (299),
upgrading (329) -- but not for the ones at the other end:

  guides/downsample_and_retain.md        2 lines of 214
  guides/query_data.md                   2 lines of 99
  query_language/continuous_queries.md   3 lines of 977
  concepts/storage_engine.md             6 lines of 428

Their entire divergence is the configuration-page IA split already solved in
content/shared/influxdb-v1/flux/installation.md: OSS administration/config#
against Enterprise administration/configure/config-data-nodes/#. Fifteen of the
30 diverge by under 40 lines. These are free files that phase C's diff -w test
could not see, not edition-specific content.

__tests__/shortcodes.md is excluded -- it is a Cypress fixture, not content.

The _comment no longer instructs deleting this file when the list empties. That
instruction is what turned an emptied worklist into an argument for removing
drift protection from pages that had never been examined. An empty list now
means the next batch is not enumerated yet.

Verification: node --test .ci/scripts/check-v1-shared-drift.test.js passes 12/12
against the hardened checker, including the union-of-base-and-head case and
"migrated pages are not listed in the manifest".

* docs(agents): extend the style guide to issues and status writing

The Documentation style section covered content pages only, so agents applied
the Google style guide to Markdown under content/ and then wrote issue bodies
and status comments in a different register -- section headings chosen for
effect, findings structured as reveals, counts placed as closing beats rather
than stated inside a sentence.

Two bullets: the style guide governs issues, pull request descriptions, and
status comments as well; and write to inform rather than to impress.

Ran yarn build:agent:instructions and yarn validate:agent-instructions. Neither
of the five generated adapter sets mirrors this section, so they are unchanged.
PLATFORM_REFERENCE.md is regenerated by those commands but its current diff
belongs to concurrent work on data/products.yml and is left uncommitted.

* docs(agents): structure commit bodies like the pull request template

What changed:
The Documentation style bullet in AGENTS.md now names commit messages alongside
issues, pull request descriptions, and status comments. The commit format
constraint points at the body structure. DOCS-CONTRIBUTING.md gains a "Commit
message body" subsection under Commit Guidelines giving the four sections and a
template.

Why:
The style rule added in 25b8bf5 covered issues and status comments but stopped
short of commit messages, so the same register problem it fixes could persist in
git history. The pull request template already asks for What changed, Why,
Impact, and Verification. Using those sections in the commit body means the two
descriptions of a change do not drift apart, and a squashed merge produces a
usable message without rewriting.

Impact:
Contributors and agents writing non-trivial commits. A one-line message is still
correct for a trivial fix. The eight commits already on this branch predate the
rule and do not follow it.

Verification:
yarn build:agent:instructions and yarn validate:agent-instructions both pass.
None of the five generated adapter sets changed, so neither edit lands in a
generated file.

* docs(v1): point identify-version and mcp-server stubs at existing shared content

What changed:
Repoint the four InfluxDB v1 OSS/Enterprise stubs for identify-version and
mcp-server at the shared content that already covers them
(content/shared/identify-version.md, content/shared/influxdb3-admin/
mcp-server-docs-only.md) instead of the empty, unpopulated wrapper files
content/shared/influxdb-v1/{administration/identify-version,tools/mcp-server}.md
created by the shared-content migration. Delete those wrapper files.
Also drop the dead enterprise-v1 identifier from a hide-in list in
identify-version.md; it never matched the show-in/hide-in identifiers
that version actually produces (v1, enterprise_influxdb,
enterprise_influxdb/v1), so it was always a no-op. v1 is already in the
same list and covers both editions.

Why:
Copilot flagged both wrapper files as empty during PR review. All four v1
stubs rendered with no article body. The wrapper files were created but
never populated or wired up; the identify-version and mcp-server content
these pages need already exists as shared content used by other products
(v2, telegraf, flux, kapacitor, chronograf, and others), following the
same source: frontmatter pattern.

Impact:
/influxdb/v1/administration/identify-version/,
/enterprise_influxdb/v1/administration/identify-version/,
/influxdb/v1/tools/mcp-server/, and
/enterprise_influxdb/v1/tools/mcp-server/ now render full content instead
of blank pages.

Verification:
Hugo build clean. Confirmed rendered article body text (not just
frontmatter) on all four pages.

* docs(v1): drop duplicate h1 from udp and graphite guides

What changed:
Remove the leading # The UDP Input / # The Graphite Input headings from
content/shared/influxdb-v1/supported_protocols/{udp,graphite}.md.

Why:
Copilot flagged both as a duplicate h1: article/content.html already
renders an h1 from the page's title frontmatter, so these produced two
h1 elements per page.

Impact:
/influxdb/v1/supported_protocols/udp/, /enterprise_influxdb/v1/
supported_protocols/udp/, and the graphite equivalents now render one h1.

Verification:
Hugo build clean; confirmed single <h1> in rendered output for all four
affected pages.

* fix(products): revert enterprise_influxdb content_path to a string

What changed:
Revert data/products.yml enterprise_influxdb.content_path from a
version-keyed map ({v1: enterprise_influxdb/v1}) back to the plain
string enterprise_influxdb it was before this migration. Regenerate
PLATFORM_REFERENCE.md.

Why:
Copilot flagged that the map shape broke consumers that only handle
string content_path paired with a string label_group.
.github/scripts/workflow-utils.js's getProductLabelMap() requires both
fields to be the same shape (string/string or map/map); enterprise_influxdb
kept a string label_group, so it matched neither branch and silently
dropped out of the product-label map, meaning shared-content PRs stopped
getting labeled product:v1-enterprise. The same map shape also made the
PLATFORM_REFERENCE.md generator omit this product's content path and URL
entirely, visible in this PR's own diff. The string shape was never the
problem: layouts/partials/product/content-path.html already appends the
version to a string content_path when the product declares versions and
the path doesn't already end with it, so enterprise_influxdb resolves to
enterprise_influxdb/v1 at render time without needing the map.

Impact:
getProductLabelMap() maps content/enterprise_influxdb/ to
product:v1-enterprise again. PLATFORM_REFERENCE.md's InfluxDB Enterprise
v1 entry has its Content path and Production docs URL back (matching the
InfluxDB OSS v1 entry format, and the pre-existing telegraf/chronograf/
kapacitor pattern of a bare content_path for single-version products).

Verification:
Hugo build clean. Confirmed /product/version/ placeholder links in shared
v1 content still resolve to /enterprise_influxdb/v1/... on Enterprise
pages. yarn build:agent:instructions regenerated PLATFORM_REFERENCE.md
cleanly.

* test(v1): add Cypress coverage for composite identifiers and shared-content path resolution

What changed:
Add test fixtures and assertions covering three behaviors this PR's
templates introduced but never exercised in Cypress:
- show-in/hide-in matching on the <product>/<version> composite
  identifier, a bare <product> identifier, and a whitespace-padded list
  (content/{influxdb,enterprise_influxdb}/v1/__tests__/shortcodes.md,
  cypress/e2e/content/shortcodes.cy.js)
- article/content.html's /product/version/ placeholder resolution against
  both a map-shaped content_path (InfluxDB OSS v1) and a string-shaped one
  (InfluxDB Enterprise v1), using the existing graphite-to-udp link in
  real shared content (cypress/e2e/content/shortcodes-real-pages.cy.js)

Why:
Copilot flagged that show-in.html, hide-in.html, and
article/content.html changed behavior with no rendering tests: the
existing show-in/hide-in test only exercised the bare version identifier
(core), and there was no test for content_path resolution at all. InfluxDB
v1 OSS and Enterprise are the only two products that share a version
(v1) but need the composite identifier to tell their pages apart, so a
regression here would silently reintroduce cross-edition show-in/hide-in
bugs.

Verification:
node cypress/support/run-e2e-specs.js --spec
"cypress/e2e/content/shortcodes.cy.js,cypress/e2e/content/shortcodes-real-pages.cy.js"
--no-mapping: 179 tests, 167 passing, 12 pending (this.skip() on products
other than v1 OSS/Enterprise), 0 failing.

* fix(ci): close v1 drift-ratchet manifest-edit bypass

What changed:
check-v1-shared-drift.js's main() now unions the manifest's pairs at the
base ref with its pairs at head before measuring divergence, instead of
only ever reading manifest.pairs from the working tree. measure() takes
an explicit pairs list rather than a manifest object.

Why:
Copilot pointed out that removing an entry from the manifest removed it
from both the head and base measurement, since both were derived from
the same (head) manifest.pairs. A PR could edit only one copy of a page
and drop its manifest entry, and the ratchet would simply stop checking
that pair instead of catching the growing divergence. Unioning the two
refs' pair lists closes that: a pair only drops out of comparison once
its files are actually gone from disk (migrated to content/shared/ or
deleted), which is the only case that should exempt it.

Impact:
None on the currently clean manifest (30 pairs, all still two genuine
copies). Prevents a future PR from silently exempting a pair from the
ratchet by editing the manifest.

Verification:
node --test .ci/scripts/check-v1-shared-drift.test.js: 12/12 passing,
including a new test asserting measure() checks whatever pairs it's
given rather than manifest.pairs. node
.ci/scripts/check-v1-shared-drift.js --base HEAD: "No v1 pair diverged
further (30 pairs checked)."

* fix(v1): repair 18 broken heading fragments in shared v1 content

What changed:
Corrects link fragments on four shared v1 pages so they match the anchors Hugo
generates:

- flux-vs-influxql.md: 13 links into query_language/functions used hyphens where
  the headings are InfluxQL function names, so the anchors keep underscores --
  #cumulative-sum against id "cumulative_sum", and 12 more.
- percentile-quantile.md: the method list linked #estimate-tdigest, #exact-mean,
  and #exact-selector against headings estimate_tdigest, exact_mean, and
  exact_selector.
- geo/_index.md and manipulate-timestamps.md: both linked
  #experimental-functions-are-subject-to-change. The heading on
  /flux/v0/stdlib/experimental/ reads "Experimental packages are subject to
  change".

Why:
The link checker on #7663 reported 18 broken fragments out of 10,059 links. All
18 predate this branch and exist in both v1 editions, and the first two groups
exist in the v2 upstream these pages were forked from. They surface now because
the checker only scans files a pull request touches, the same way moving text
into content/shared/ exposes existing Vale errors.

Impact:
Readers following these links reached the top of the target page instead of the
named section.

Verification:
npx hugo --quiet exits 0. Every fragment was checked against the ids in the
rendered HTML for both editions rather than against the Markdown headings: all
three percentile-quantile anchors resolve, all 49 function anchors referenced
from flux-vs-influxql resolve, and the experimental fragment resolves.

* Update AGENTS.md

* Update AGENTS.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

product:shared Shared content across products product:v1-enterprise InfluxDB Enterprise v1 product:v1 InfluxDB v1 OSS product:v2-cloud InfluxDB Cloud (TSM) product:v2 InfluxDB v2 (Cloud TSM, OSS) product:v3-distributed InfluxDB 3 Cloud Serverless, Cloud Dedicated, Clustered product:v3-monolith InfluxDB 3 Core and Enterprise (single-node / clusterable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant