docs(v1): share byte-identical v1 content between OSS and Enterprise - #7622
Conversation
InfluxDB v1 OSS (content/influxdb/v1) and v1 Enterprise (content/enterprise_influxdb/v1) kept two copies of every overlapping page, coupled by convention only. They drifted: 74 overlapping pages differ by 4,881 lines, including edition-independent Flux guides and OSS links to a tools/shell/ page that no longer exists. Move the 31 pages whose two copies are provably equivalent into content/shared/influxdb-v1/, leaving thin front-matter stubs. For these, duplication is now structurally impossible rather than discouraged. The v1 pair is the only shared pair whose editions do not share a product root, so the existing <product-root>/version link placeholder cannot serve it. Shared v1 content uses a neutral /product/version/ placeholder that article/content.html resolves from the consuming page's content_path in data/products.yml. Path resolution no longer parses the URL. Both v1 editions cascade version: v1, so show-in/hide-in could not tell them apart. They now match <version>, <product>, and <product>/<version>. Decisions and rejected alternatives: docs/adr/0001-0003. Side effects, both intentional: - show-in/hide-in now trim list entries. Five call sites wrote "core, enterprise" with a space and never matched, so powerbi.md rendered "Your with query permissions for the target database" on Enterprise. Those pages now render as written. - Moving text out of front-matter'd pages exposes pre-existing Vale errors, because Vale under-reports on pages that have front matter. Twenty-one mechanical fixes applied (spacing, Latin abbreviations, two duplicated words); "50th percentile" exempted inline as a standard technical term. The remaining 24 pairs need per-hunk editorial judgment and are deferred. A transitional blocking check keeps them from drifting further; it deletes itself when the manifest empties. Verification: Hugo build clean; zero unresolved placeholders across 5,959 pages; baseline-vs-migrated diff shows 60 v1 pages and 2 v3 pages changed as intended and nothing else, after subtracting build nondeterminism proven by a control build of identical code.
Vale Style Check Results
Warnings (6)
✅ Check passed |
Release version checkNo release-notes pages with a tracked version changed in this PR. 💡 Badge new features with the versionDocumenting a new feature? Add a version badge in the page frontmatter — the
For inline version text, use |
🔗 Link Check Results — Link Check Bot✅ All links are valid
|
| Source File | URL | Issue |
|---|---|---|
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/crosswalk/_index.md |
https://support.influxdata.com/ | Network error: SSL certificate not trusted. Use --insecure if site is trusted (e… |
content/enterprise_influxdb/v1/concepts/glossary/_index.md |
https://support.influxdata.com/ | Network error: SSL certificate not trusted. Use --insecure if site is trusted (e… |
content/enterprise_influxdb/v1/concepts/insights_tradeoffs/_index.md |
https://reddit.com/r/influxdb | Error (cached) |
content/enterprise_influxdb/v1/concepts/insights_tradeoffs/_index.md |
https://support.influxdata.com/ | Error (cached): Error (cached) |
content/enterprise_influxdb/v1/concepts/time-series-index/_index.md |
https://reddit.com/r/influxdb | Error (cached) |
content/enterprise_influxdb/v1/concepts/time-series-index/_index.md |
https://support.influxdata.com/ | Error (cached): Error (cached) |
content/enterprise_influxdb/v1/flux/flux-vs-influxql/_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/_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/ | Error (cached): Error (cached) |
content/enterprise_influxdb/v1/flux/get-started/syntax-basics/_index.md |
https://reddit.com/r/influxdb | 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/get-started/transform-data/_index.md |
https://support.influxdata.com/ | Error (cached): Error (cached) |
content/enterprise_influxdb/v1/flux/guides/calculate-percentages/_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/conditional-logic/_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/cumulativesum/_index.md |
https://reddit.com/r/influxdb | Error (cached) |
content/enterprise_influxdb/v1/flux/guides/cumulativesum/_index.md |
https://support.influxdata.com/ | Error (cached): Error (cached) |
content/enterprise_influxdb/v1/flux/guides/exists/_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/fill/_index.md |
https://reddit.com/r/influxdb | Error (cached) |
Showing first 20 of 35 warnings. See the workflow run for full results.
Full details: workflow run summary and artifact. Last updated: 2026-08-18 17:18:33 UTC
Vale 3.17.0 (the version CI pins) flags two errors that the pre-migration pages never surfaced: - The median stubs' description repeated "(50th percentile)" alongside "median". Vale lints short stubs' front matter, unlike the long pages these replaced. Dropped the redundant parenthetical. - group-data.md used spaced en dashes around an appositive. Replaced with an unspaced em dash per Google style. Pre-existing in both editions. Verified with Vale 3.17.0 rather than the locally installed 3.15.1: vale.sh only enforces its VALE_VERSION pin in CI and the Docker fallback, accepting any local major >= 3.
The link checker only inspects changed files, so these pages had not been checked in a long time. All were already broken on master: - median.md anchors used hyphens (#estimate-tdigest) but Hugo keeps the underscores from the headings (#estimate_tdigest). - collectd.md and graphite.md linked #a-note-on-udp-ip-os-buffer-sizes; Hugo drops the slash in 'UDP/IP', producing #a-note-on-udpip-os-buffer-sizes. - math_operators.md pointed at github.com/influxdb/influxdb (wrong org, 404). The influxdata org URL returns 200. The remaining failure, the dead regex-golang.appspot.com tester, needs an editorial choice of replacement and is tracked in #7623 under area:links, which downgrades it to a warning.
There was a problem hiding this comment.
🟡 Changes recommended
Empty shared targets, a bypassable ratchet, and data-shape regressions can blank pages or disable automation.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
Centralizes equivalent InfluxDB v1 OSS and Enterprise documentation to prevent future content drift.
Changes:
- Moves 31 page pairs into shared content with thin product stubs.
- Adds product-aware link and visibility resolution.
- Adds ADRs and a CI divergence ratchet for remaining pairs.
File summaries
| File | Description |
|---|---|
PLATFORM_REFERENCE.md |
Regenerates product path reference. |
data/products.yml |
Changes Enterprise v1 path shape. |
layouts/partials/article/content.html |
Resolves shared-content placeholders. |
layouts/partials/product/content-path.html |
Adds product path resolver. |
layouts/shortcodes/show-in.html |
Expands visibility matching. |
layouts/shortcodes/hide-in.html |
Expands visibility matching. |
docs/adr/0001-share-influxdb-v1-prose-content.md |
Records sharing decision. |
docs/adr/0002-keep-v1-url-roots.md |
Records URL-root decision. |
docs/adr/0003-edition-discrimination-in-shared-v1-content.md |
Records edition matching decision. |
.github/workflows/pr-v1-shared-drift.yml |
Adds drift-check workflow. |
.ci/v1-shared-drift-manifest.json |
Lists remaining divergent pairs. |
.ci/scripts/check-v1-shared-drift.js |
Implements divergence ratchet. |
.ci/scripts/check-v1-shared-drift.test.js |
Tests divergence logic. |
content/shared/influxdb-v1/write_protocols/_index.md |
Shares write-protocol overview. |
content/shared/influxdb-v1/administration/identify-version.md |
Adds identify-version target. |
content/shared/influxdb-v1/concepts/crosswalk.md |
Shares crosswalk content. |
content/shared/influxdb-v1/concepts/insights_tradeoffs.md |
Shares design tradeoffs. |
content/shared/influxdb-v1/concepts/time-series-index.md |
Shares TSI overview. |
content/shared/influxdb-v1/query_language/math_operators.md |
Shares math-operator reference. |
content/shared/influxdb-v1/troubleshooting/_index.md |
Shares troubleshooting index. |
content/shared/influxdb-v1/troubleshooting/systemd.md |
Shares systemd guidance. |
content/shared/influxdb-v1/supported_protocols/_index.md |
Shares protocol index. |
content/shared/influxdb-v1/supported_protocols/collectd.md |
Shares collectd guidance. |
content/shared/influxdb-v1/supported_protocols/graphite.md |
Shares Graphite guidance. |
content/shared/influxdb-v1/supported_protocols/opentsdb.md |
Shares OpenTSDB guidance. |
content/shared/influxdb-v1/supported_protocols/udp.md |
Shares UDP guidance. |
content/shared/influxdb-v1/tools/flux-vscode.md |
Shares VS Code guidance. |
content/shared/influxdb-v1/tools/inch.md |
Shares inch guidance. |
content/shared/influxdb-v1/tools/mcp-server.md |
Adds MCP wrapper. |
content/shared/influxdb-v1/tools/influxd/_index.md |
Shares influxd overview. |
content/shared/influxdb-v1/tools/influxd/config.md |
Shares config command. |
content/shared/influxdb-v1/tools/influxd/run.md |
Shares run command. |
content/shared/influxdb-v1/tools/influxd/version.md |
Shares version command. |
content/shared/influxdb-v1/flux/guides/_index.md |
Shares Flux guide index. |
content/shared/influxdb-v1/flux/guides/cumulativesum.md |
Shares cumulative-sum guide. |
content/shared/influxdb-v1/flux/guides/fill.md |
Shares fill guide. |
content/shared/influxdb-v1/flux/guides/geo/shape-geo-data.md |
Shares geo-shaping guide. |
content/shared/influxdb-v1/flux/guides/group-data.md |
Shares grouping guide. |
content/shared/influxdb-v1/flux/guides/increase.md |
Shares increase guide. |
content/shared/influxdb-v1/flux/guides/median.md |
Shares median guide. |
content/shared/influxdb-v1/flux/guides/moving-average.md |
Shares moving-average guide. |
content/shared/influxdb-v1/flux/guides/rate.md |
Shares rate guide. |
content/shared/influxdb-v1/flux/guides/regular-expressions.md |
Shares regex guide. |
content/shared/influxdb-v1/flux/guides/sort-limit.md |
Shares sorting guide. |
content/influxdb/v1/write_protocols/_index.md |
Sources shared content. |
content/influxdb/v1/administration/identify-version.md |
Sources shared content. |
content/influxdb/v1/concepts/crosswalk.md |
Sources shared content. |
content/influxdb/v1/concepts/insights_tradeoffs.md |
Sources shared content. |
content/influxdb/v1/concepts/time-series-index.md |
Sources shared content. |
content/influxdb/v1/query_language/math_operators.md |
Sources shared content. |
content/influxdb/v1/troubleshooting/_index.md |
Sources shared content. |
content/influxdb/v1/troubleshooting/systemd.md |
Sources shared content. |
content/influxdb/v1/supported_protocols/_index.md |
Sources shared content. |
content/influxdb/v1/supported_protocols/collectd.md |
Sources shared content. |
content/influxdb/v1/supported_protocols/graphite.md |
Sources shared content. |
content/influxdb/v1/supported_protocols/opentsdb.md |
Sources shared content. |
content/influxdb/v1/supported_protocols/udp.md |
Sources shared content. |
content/influxdb/v1/tools/flux-vscode.md |
Sources shared content. |
content/influxdb/v1/tools/inch.md |
Sources shared content. |
content/influxdb/v1/tools/mcp-server.md |
Sources shared content. |
content/influxdb/v1/tools/influxd/_index.md |
Sources shared content. |
content/influxdb/v1/tools/influxd/config.md |
Sources shared content. |
content/influxdb/v1/tools/influxd/run.md |
Sources shared content. |
content/influxdb/v1/tools/influxd/version.md |
Sources shared content. |
content/influxdb/v1/flux/guides/_index.md |
Sources shared content. |
content/influxdb/v1/flux/guides/cumulativesum.md |
Sources shared content. |
content/influxdb/v1/flux/guides/fill.md |
Sources shared content. |
content/influxdb/v1/flux/guides/geo/shape-geo-data.md |
Sources shared content. |
content/influxdb/v1/flux/guides/group-data.md |
Sources shared content. |
content/influxdb/v1/flux/guides/increase.md |
Sources shared content. |
content/influxdb/v1/flux/guides/median.md |
Sources shared content. |
content/influxdb/v1/flux/guides/moving-average.md |
Sources shared content. |
content/influxdb/v1/flux/guides/rate.md |
Sources shared content. |
content/influxdb/v1/flux/guides/regular-expressions.md |
Sources shared content. |
content/influxdb/v1/flux/guides/sort-limit.md |
Sources shared content. |
content/enterprise_influxdb/v1/write_protocols/_index.md |
Sources shared content. |
content/enterprise_influxdb/v1/administration/identify-version.md |
Sources shared content. |
content/enterprise_influxdb/v1/concepts/crosswalk.md |
Sources shared content. |
content/enterprise_influxdb/v1/concepts/insights_tradeoffs.md |
Sources shared content. |
content/enterprise_influxdb/v1/concepts/time-series-index.md |
Sources shared content. |
content/enterprise_influxdb/v1/query_language/math_operators.md |
Sources shared content. |
content/enterprise_influxdb/v1/troubleshooting/_index.md |
Sources shared content. |
content/enterprise_influxdb/v1/troubleshooting/systemd.md |
Sources shared content. |
content/enterprise_influxdb/v1/supported_protocols/_index.md |
Sources shared content. |
content/enterprise_influxdb/v1/supported_protocols/collectd.md |
Sources shared content. |
content/enterprise_influxdb/v1/supported_protocols/graphite.md |
Sources shared content. |
content/enterprise_influxdb/v1/supported_protocols/opentsdb.md |
Sources shared content. |
content/enterprise_influxdb/v1/supported_protocols/udp.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/flux-vscode.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/inch.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/mcp-server.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/influxd/_index.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/influxd/config.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/influxd/run.md |
Sources shared content. |
content/enterprise_influxdb/v1/tools/influxd/version.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/_index.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/cumulativesum.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/fill.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/geo/shape-geo-data.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/group-data.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/increase.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/median.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/moving-average.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/rate.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/regular-expressions.md |
Sources shared content. |
content/enterprise_influxdb/v1/flux/guides/sort-limit.md |
Sources shared content. |
Review details
- Files reviewed: 105/106 changed files
- Comments generated: 10
- Review effort level: Balanced
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
regex-golang.appspot.com returns 404; the App Engine app is gone. Removing the entry rather than replacing it: Regex101, already listed on the next line, supports the Golang/RE2 flavor, so the 'Go regex testers' section still points readers at a working tool. The identical link in content/shared/influxdb-v2/query-data/flux/regular-expressions.md is untouched here and stays tracked in #7623.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jstirnaman <212227+jstirnaman@users.noreply.github.com>
Fixes for Copilot review commentsWhat changed
Why Copilot's review flagged 10 issues. All 10 checked out: three meant pages would render with no article body, one was already visibly broken in this PR's own Impact
Verification
|
…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
Part of #7620
What changed
Moved the 31 InfluxDB v1 pages whose OSS and Enterprise copies are provably
equivalent into
content/shared/influxdb-v1/, leaving thin front-matter stubs inboth editions. For those pages, duplication is now structurally impossible rather
than discouraged by convention.
Supporting mechanism:
layouts/partials/product/content-path.html(new) resolves a product's URLroot from
data/products.yml, handling both the map and stringcontent_pathshapes.
layouts/partials/article/content.htmlnow resolves a product-neutral/product/version/placeholder using the page'sproduct/versioncascadeinstead of parsing the URL. The existing
<product-root>/versionform stillworks, including the digit-insensitivity that lets
/influxdb/version/resolveon
influxdb3/*pages.show-in/hide-innow match<version>,<product>, and the composite<product>/<version>.data/products.yml--enterprise_influxdb.content_pathis now aversion-keyed map, matching
influxdb..ci/scripts/check-v1-shared-drift.js(+ 11 unittests),
.ci/v1-shared-drift-manifest.json, and.github/workflows/pr-v1-shared-drift.yml.Decisions and rejected alternatives:
docs/adr/0001-0003.Why
The two v1 trees were coupled by convention only. Nothing failed when a fix
landed in one copy and not the other, so they drifted: 74 overlapping pages
differ by 4,881 lines, including edition-independent Flux guides and OSS links
to a
tools/shell/page that no longer exists.v1 is the only shared pair in this repo whose editions do not share a product
root (
/influxdb/v1/vs/enterprise_influxdb/v1/), which is why the existingplaceholder could not serve it -- one literal string cannot resolve to two roots.
Moving Enterprise v1 under the
influxdbroot was considered and deferred: itchanges 186 URLs and ~1,968 link references, and none of that is needed to stop
the drift (
docs/adr/0002).Impact
Two intentional side effects reach beyond v1. Both are called out because the
title does not imply them:
show-in/hide-innow trim list entries. Five call sites wrote"core, enterprise"with a space, and the untrimmed token never matched, sopowerbi.mdrendered "Database token: Your with query permissions for thetarget database" on Enterprise, Clustered, and Cloud Dedicated. Those pages
now render as written. Affects 2 pages.
because Vale under-reports on pages that have front matter (filed as Vale under-reports on pages with front matter, so product pages are linted less strictly than shared content #7617).
21 mechanical fixes applied -- spacing, Latin abbreviations, two duplicated
words.
50th percentileis exempted inline as a standard technical term.The 24 pairs that need per-hunk editorial judgment (1,508 lines) are not in
this PR. They are tracked in #7620 and guarded by the ratchet, which blocks any PR
that increases divergence in a listed pair. The ratchet is transitional and is
deleted when the manifest empties.
Verification
npx hugoexits 0; 5,959 pages./product/version/or<root>/version/placeholderssitewide.
intended, 0 unintended. Asset fingerprints were normalized, and Hugo build
nondeterminism (~26 pages, filed as Hugo output is not reproducible: shortcode placeholder counter and taxonomy title casing vary between identical builds #7619) was proven with a control build of
identical code and subtracted.
restored;
node --test11/11..vale-instructions.ini(0 errors, 31 files). Codeblock lint,
check-source-paths, andcheck-feedback-linkspass. All pre-commit hooks pass.test:shortcode-examples: 5/6. The one failure,Docs home, can search with mispellings, queries Algolia's hosted index, whichreflects production and cannot be affected by this branch.
Checklist
npx hugo --quiet)