This is an automated email from the ASF dual-hosted git repository.

bamaer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new f37520fb52 Escape variable references in the docs that Asciidoctor 
reads as attributes #9069 (#9087)
f37520fb52 is described below

commit f37520fb52b99d9940b0c63be65cab3bad9e09e5
Author: Ankit Garg <[email protected]>
AuthorDate: Fri Oct 23 11:29:04 2026 +0530

    Escape variable references in the docs that Asciidoctor reads as attributes 
#9069 (#9087)
    
    A variable such as ${PROJECT_HOME} in inline code is read by Asciidoctor
    as the attribute {PROJECT_HOME}, which gives 35 "skipping reference to
    missing attribute" warnings in 27 pages when building the docs. Write
    them as `+${PROJECT_HOME}+`, like the other pages already do.
    
    Also remove the stray "(TODO)" at the end of the IHopMetadataObjectFactory
    paragraph in the metadata plugins page of the developer manual.
---
 .../hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc | 2 +-
 docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc          | 1 -
 docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc                   | 2 +-
 docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc         | 2 +-
 .../hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc | 2 +-
 docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc       | 2 +-
 docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc       | 2 +-
 .../ROOT/pages/metadata-types/graphs/graph-database-connection.adoc   | 2 +-
 .../modules/ROOT/pages/metadata-types/masking-pattern.adoc            | 2 +-
 .../modules/ROOT/pages/metadata-types/smb-connection.adoc             | 4 ++--
 .../modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc      | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc     | 4 ++--
 .../ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc        | 2 +-
 .../ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc       | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc         | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc        | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc    | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc   | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc      | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/jsoninput.adoc             | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc     | 4 ++--
 .../modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc      | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc     | 2 +-
 .../modules/ROOT/pages/pipeline/transforms/watchfiles.adoc            | 4 ++--
 .../modules/ROOT/pages/pipeline/transforms/webservices.adoc           | 4 ++--
 .../modules/ROOT/pages/technology/graph-databases/index.adoc          | 2 +-
 .../modules/ROOT/pages/workflow/actions/graph-constraint.adoc         | 2 +-
 .../modules/ROOT/pages/workflow/actions/graph-index.adoc              | 2 +-
 28 files changed, 32 insertions(+), 33 deletions(-)

diff --git 
a/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc 
b/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc
index a20d494cca..425a19276b 100644
--- a/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc
+++ b/docs/hop-dev-manual/modules/ROOT/pages/annotation-derived-widgets.adoc
@@ -78,7 +78,7 @@ Sort key among the widgets in this parent, compared as a 
string.
 `label` and `toolTip`::
 Shown next to the control.
 Use an `i18n::` key, as described in 
xref:internationalisation.adoc[Internationalisation].
-In the properties file, quote a variable expression with single quotes: 
`Folder='${PROJECT_HOME}'`.
+In the properties file, quote a variable expression with single quotes: 
`+Folder='${PROJECT_HOME}'+`.
 
 `parentId`::
 The form this widget belongs to.
diff --git a/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc 
b/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc
index 18fd64bfdb..cb1873973f 100644
--- a/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc
+++ b/docs/hop-dev-manual/modules/ROOT/pages/metadata-plugins.adoc
@@ -142,5 +142,4 @@ The parent object is often another metadata object.
 You can use it to check if it implements IVariables so you can inherit 
variables from there.
 * ```public String getObjectId( Object object ) throws HopException``` -> 
Retrieves the object ID from the given object.
 We recommend that you check the instance of the object until the factory 
interface supports generics.
-(TODO)
 
diff --git a/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc 
b/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc
index ffdbe85bce..b01168b7df 100644
--- a/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc
+++ b/docs/hop-dev-manual/modules/ROOT/pages/sdk/vfs.adoc
@@ -33,7 +33,7 @@ Using `java.io.File` is one of the most common causes of bugs 
when running pipel
 
 * **Non-local Schemes:** `java.io.File` only understands the local operating 
system's filesystem syntax. Passing a cloud path such as 
`s3://my-bucket/orders.csv` or `gs://my-bucket/orders.csv` to `java.io.File` 
will either throw a `FileNotFoundException` or corrupt the path into a 
nonsensical local directory like `./s3:/my-bucket/orders.csv`.
 * **Portability across Runtimes:** Pipelines configured on a local machine 
frequently execute on a remote Hop Server, in a Docker container, or on a 
distributed cluster with Apache Beam / Spark / Flink. Using `HopVfs` ensures 
that paths remain portable across all runtime targets.
-* **Variable Resolution:** `HopVfs` automatically expands variables (such as 
`${PROJECT_HOME}/data/file.csv` or `${S3_BUCKET}/data.parquet`) before 
resolving the underlying file system provider.
+* **Variable Resolution:** `HopVfs` automatically expands variables (such as 
`+${PROJECT_HOME}/data/file.csv+` or `+${S3_BUCKET}/data.parquet+`) before 
resolving the underlying file system provider.
 
 == Core File Operations with HopVfs
 
diff --git a/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc
index c7d6d457bc..2b38be89b2 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/docker-container.adoc
@@ -607,7 +607,7 @@ Connections that are defined as metadata in your project, 
such as xref:vfs/aws-s
 * An S3 connection with the `Default (environment / instance profile)` 
authentication type uses the `AWS_*` variables from the table above.
 * An Azure connection with the `Managed Identity` authentication type also 
accepts a service principal through `AZURE_CLIENT_ID`, `AZURE_TENANT_ID` and 
`AZURE_CLIENT_SECRET`.
 
-Other connection fields can use Hop variables such as `${S3_SECRET_KEY}`.
+Other connection fields can use Hop variables such as `+${S3_SECRET_KEY}+`.
 Container environment variables are not Hop variables.
 Set them in the environment configuration file 
(`HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS`) or pass them as system properties 
with `HOP_SYSTEM_PROPERTIES`.
 
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc
index 6478ea6c5f..6dd4ca281d 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/hop-gui/vfs-file-explorer.adoc
@@ -123,7 +123,7 @@ After a cut and paste, the files that were moved leave the 
explorer clipboard.
 Files you skipped, or that could not be moved, stay on it, so you can paste 
them again.
 
 Right-click a file or folder and choose **Copy path** to put its path on the 
system clipboard.
-**Copy path as '${PROJECT_HOME}/...'** writes it relative to the project home 
folder, ready to paste into a transform or action.
+**Copy path as '+${PROJECT_HOME}+/...'** writes it relative to the project 
home folder, ready to paste into a transform or action.
 
 == Save a copy, copy to a folder, download and upload
 
diff --git a/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc
index 6ae394d785..b2bd1cc1bf 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/hop-tools/hop-lint.adoc
@@ -46,7 +46,7 @@ Relative paths, for the target and for options such as 
`--output`, `--config` an
 == Project and environment
 
 `hop lint` takes the project and environment options of `hop run`.
-Hop's own checks then see the variables a pipeline is run with, so a transform 
that reads `'${INPUT_FOLDER}'` from the environment is checked against that 
folder rather than reported as unable to find it.
+Hop's own checks then see the variables a pipeline is run with, so a transform 
that reads `+'${INPUT_FOLDER}'+` from the environment is checked against that 
folder rather than reported as unable to find it.
 Without `-j` or `-e` the default project and environment from the Hop 
configuration apply, but only to what lies inside that project.
 Anything else, such as another project's folder or a commit checked by the 
pre-commit hook, is linted with the `metadata` folder found above it.
 A project chosen with `-j` or `-e` applies whatever is linted; for a target 
outside it, `hop lint` prints a warning.
diff --git a/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc
index be6068f081..8f50bb1771 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/linting/lint-rules.adoc
@@ -101,7 +101,7 @@ Scope such a rule with `appliesTo`, naming the metadata key 
— the folder name
 |is a collection with at least one entry
 
 |`NO_HARDCODED`
-|is empty, or takes its value from a variable (`${NAME}`, `%%NAME%%`) or a 
variable resolver (`#{vault:path:key}`) rather than holding a literal value. An 
`Encrypted` value is a literal value: Hop obfuscates it, and anyone with Hop 
and the same encoder key can read it back
+|is empty, or takes its value from a variable (`+${NAME}+`, `%%NAME%%`) or a 
variable resolver (`#{vault:path:key}`) rather than holding a literal value. An 
`Encrypted` value is a literal value: Hop obfuscates it, and anyone with Hop 
and the same encoder key can read it back
 
 |`MAX_VALUE`, `MIN_VALUE`, `EXACT_VALUE`
 |compares as required against `conditionValue`
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
index 1ecd59147d..283676683f 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/graphs/graph-database-connection.adoc
@@ -146,7 +146,7 @@ They are grouped in four tabs:
 
 |Protocol
 |Automatic configuration, protocol (URL scheme), routing, routing policy, 
encryption and trusting all certificates.
-Every on/off option has a variable alternative which, when set, overrides it, 
for example `'${NEO4J_ENCRYPTION}'`.
+Every on/off option has a variable alternative which, when set, overrides it, 
for example `+'${NEO4J_ENCRYPTION}'+`.
 
 |Advanced
 |Connection liveness check timeout, maximum connection lifetime, maximum 
connection pool size, connection acquisition timeout, connection timeout and 
maximum transaction retry time, all in milliseconds.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc
index dca8d136ab..62ea9ba127 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/masking-pattern.adoc
@@ -77,5 +77,5 @@ image::metadata-types/masking-pattern-first-name.jpg[Masking 
pattern first-name,
 |Mapping table. A second table with the suffix `_seq` stores the next sequence 
number. Both are created when they are missing. A new mapping table holds 
masked values of up to 255 characters.
 
 |Hash secret
-|The mapping table stores an HMAC-SHA256 of each value, made with this secret, 
instead of the value itself. Use a variable such as `${MASKING_SECRET}`. 
Changing the secret starts a new mapping. Without a secret the table stores the 
original values and is itself personal data.
+|The mapping table stores an HMAC-SHA256 of each value, made with this secret, 
instead of the value itself. Use a variable such as `+${MASKING_SECRET}+`. 
Changing the secret starts a new mapping. Without a secret the table stores the 
original values and is itself personal data.
 |===
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc
index e65ecca900..eb21826ae9 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/metadata-types/smb-connection.adoc
@@ -42,7 +42,7 @@ The tabs are Server, Authentication, and Security.
 |===
 |Option|Description
 |Description|Optional note about this connection. It is not part of the URL.
-|Hostname|Server name. A variable such as `${FINANCE_FILE_SERVER}` is resolved 
at runtime. For Azure Files this is `account.file.core.windows.net`.
+|Hostname|Server name. A variable such as `+${FINANCE_FILE_SERVER}+` is 
resolved at runtime. For Azure Files this is `account.file.core.windows.net`.
 |Port|TCP port. Default `445`.
 |Share|Share name, without a leading slash.
 |Folder in the share|Optional folder. Every path on this connection stays 
under that folder.
@@ -61,7 +61,7 @@ Kerberos is not available in this version.
 The connection type is the place it will be added.
 
 The password is stored with Hop's password encoder.
-A variable such as `${SMB_PASSWORD}` is resolved at runtime.
+A variable such as `+${SMB_PASSWORD}+` is resolved at runtime.
 
 == Security
 
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
index 5d4816e416..898cc6ff95 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/avro-file-output.adoc
@@ -63,7 +63,7 @@ Note: This name has to be unique in a single pipeline.
 
 |Schema filename
 |Filepath to write or read the schema from.
-The path can contain variables, for example 
`${PROJECT_HOME}/schemas/customer.avsc`, and can point to any file system Hop 
supports (local, `s3://`, `azure://`, `gs://`, ...).
+The path can contain variables, for example 
`+${PROJECT_HOME}/schemas/customer.avsc+`, and can point to any file system Hop 
supports (local, `s3://`, `azure://`, `gs://`, ...).
 When *Automatically create schema* is disabled, the transform reads the schema 
from this file before it writes the first row, and fails if the file can't be 
read or isn't a valid Avro schema.
 
 |Create parent folder
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
index c7f513c1c9..2817dcfdb6 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamdebeziuminput.adoc
@@ -37,10 +37,10 @@ PostgreSQL is included; other connectors and their drivers 
must be supplied by t
 |Transform name |Unique name within the pipeline.
 |Connector |`PostgreSQL` (bundled) or `Custom` (user-supplied Kafka Connect 
source connector).
 |Custom connector class |Fully qualified `SourceConnector` implementation, 
used only for Custom. A missing/incompatible class fails pipeline preparation 
with a classpath diagnostic.
-|Hostname |Database host, for example `'${CDC_HOST}'`.
+|Hostname |Database host, for example `+'${CDC_HOST}'+`.
 |Port |Positive TCP port (1–65535). Default: 5432.
 |Username |Database account with CDC/replication privileges.
-|Password |Use a secret variable such as `'${CDC_PASSWORD}'`. Hop encrypts 
literal passwords in transform XML using its standard password handling; this 
is not a secure credential vault.
+|Password |Use a secret variable such as `+'${CDC_PASSWORD}'+`. Hop encrypts 
literal passwords in transform XML using its standard password handling; this 
is not a secure credential vault.
 |Connector properties (JSON) |JSON object whose values are strings. Configure 
database, tables, snapshot mode, slot, publication, SSL and other 
connector-specific options here. Variables are resolved before parsing. 
Connection-tab settings cannot be duplicated here. This JSON is stored as text, 
not encrypted: reference variables for any additional secrets.
 |JSON field |Name of the single output String field. Default: `event`.
 |Maximum records |Optional positive integer, at most 2147483647. Stops after 
this many events. Blank means no record limit; an idle database can wait 
indefinitely if no time limit is set.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
index 77b7fb0c13..cfcb8011c9 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchinput.adoc
@@ -29,7 +29,7 @@ It is not an incremental change feed and does not parse 
document properties into
 
 == Options
 
-All String settings support Hop variables, for example `${ES_HOSTS}` and 
`${ES_PASSWORD}`.
+All String settings support Hop variables, for example `+${ES_HOSTS}+` and 
`+${ES_PASSWORD}+`.
 Variables are resolved while constructing the Beam graph. Empty required 
settings, unresolved variables and invalid configuration fail before 
submission; credentials must also be available on workers through the resolved 
graph.
 
 [options="header"]
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
index 9b4510cb24..7809e17353 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamelasticsearchoutput.adoc
@@ -29,7 +29,7 @@ The sink does not create mappings or manage index lifecycle. 
Ensure the target i
 
 == Options
 
-All String settings support Hop variables, for example `${ES_HOSTS}` and 
`${ES_PASSWORD}`.
+All String settings support Hop variables, for example `+${ES_HOSTS}+` and 
`+${ES_PASSWORD}+`.
 Variables are resolved while constructing the Beam graph. Empty required 
settings, unresolved variables and invalid configuration fail before 
submission; credentials must also be available on workers through the resolved 
graph.
 
 [options="header"]
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
index 58a293aa35..55c84864ea 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttinput.adoc
@@ -36,7 +36,7 @@ Read MQTT message payloads as Hop rows using Apache Beam 
MqttIO. This is a sourc
 |Topic|Required subscription filter.
 |Client ID prefix|Optional prefix. Beam appends a UUID and truncates the 
resulting client ID to 23 characters. Leave empty for a random ID; use a short 
prefix to preserve random suffix characters.
 |Username|Optional broker username.
-|Password|Optional broker password, requires a username. Masked in the dialog 
and encrypted with Hop password conventions in saved pipelines. Prefer a secret 
variable such as `${MQTT_PASSWORD}`.
+|Password|Optional broker password, requires a username. Masked in the dialog 
and encrypted with Hop password conventions in saved pipelines. Prefer a secret 
variable such as `+${MQTT_PASSWORD}+`.
 |Payload field|Name of the output payload field (default `message`).
 |Payload type|`String` or `Binary`. String decodes UTF-8; Binary preserves 
arbitrary bytes.
 |Maximum records|Non-negative record limit; zero or empty means unlimited.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
index fdc9beb00d..32ac005528 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beammqttoutput.adoc
@@ -36,7 +36,7 @@ Publish one MQTT message for each incoming Hop row using 
Apache Beam MqttIO. Con
 |Topic|Required fixed publish topic.
 |Client ID prefix|Optional prefix. Beam appends a UUID and truncates the 
resulting client ID to 23 characters. Leave empty for a random ID; use a short 
prefix to preserve random suffix characters.
 |Username|Optional broker username.
-|Password|Optional broker password, requires a username. Masked in the dialog 
and encrypted with Hop password conventions in saved pipelines. Prefer a secret 
variable such as `${MQTT_PASSWORD}`.
+|Password|Optional broker password, requires a username. Masked in the dialog 
and encrypted with Hop password conventions in saved pipelines. Prefer a secret 
variable such as `+${MQTT_PASSWORD}+`.
 |Payload field|Required incoming field to publish (default `message`).
 |Payload type|`String` or `Binary`. String uses Hop value metadata to convert 
to text, then encodes UTF-8. Binary requires a Hop Binary field and preserves 
the bytes. Null payloads fail the pipeline; empty payloads are allowed.
 |Retain messages|Sets the MQTT retained flag. Default is off. A retained 
publish replaces the broker's retained message; a retained empty payload clears 
it.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
index 3cee05474d..2030598351 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeinput.adoc
@@ -36,7 +36,7 @@ The read is bounded. SnowflakeIO rejects a streaming read, 
and this transform do
 |Transform name|Unique name in the pipeline.
 |Server|Required account host. It must look like 
`account.snowflakecomputing.com`. The value is not repeated in an error.
 |Username|Required Snowflake user.
-|Password|Used when no private key is set. Masked in the dialog and encrypted 
with Hop password conventions. Prefer a variable such as 
`${SNOWFLAKE_PASSWORD}`.
+|Password|Used when no private key is set. Masked in the dialog and encrypted 
with Hop password conventions. Prefer a variable such as 
`+${SNOWFLAKE_PASSWORD}+`.
 |Private key|PEM private key. When this is set, Hop uses key-pair 
authentication and does not send the password. A passphrase is optional. Key 
files and OAuth are not offered.
 |Database|Optional database identifier.
 |Warehouse|Optional warehouse identifier.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
index cd1b70784d..2ad65d1905 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsnowflakeoutput.adoc
@@ -36,7 +36,7 @@ Snowpipe is not used. An unbounded collection is rejected. 
Declared Beam compati
 |Transform name|Unique name in the pipeline.
 |Server|Required account host. It must look like 
`account.snowflakecomputing.com`. The value is not repeated in an error.
 |Username|Required Snowflake user.
-|Password|Used when no private key is set. Masked in the dialog and encrypted 
with Hop password conventions. Prefer a variable such as 
`${SNOWFLAKE_PASSWORD}`.
+|Password|Used when no private key is set. Masked in the dialog and encrypted 
with Hop password conventions. Prefer a variable such as 
`+${SNOWFLAKE_PASSWORD}+`.
 |Private key|PEM private key. When this is set, Hop uses key-pair 
authentication and does not send the password. A passphrase is optional. Key 
files and OAuth are not offered.
 |Database|Optional database identifier.
 |Warehouse|Optional warehouse identifier.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
index c24fcf4abb..ac863a7f21 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/beamsplunkoutput.adoc
@@ -35,7 +35,7 @@ The HEC token is sent as `Authorization: Splunk <token>`. The 
request URL is the
 |Option|Description
 |Transform name|Unique name in the pipeline.
 |HEC URL|Required base URL, `http://host:8088` or `https://host:8088`. No 
path, user info or query.
-|HEC token|Required token. Masked in the dialog and encrypted with Hop 
password conventions in saved pipelines. Prefer a secret variable such as 
`${SPLUNK_HEC_TOKEN}`.
+|HEC token|Required token. Masked in the dialog and encrypted with Hop 
password conventions in saved pipelines. Prefer a secret variable such as 
`+${SPLUNK_HEC_TOKEN}+`.
 |Batch count|Optional events per HTTP request. Empty uses the Beam default of 
10. A partial batch is flushed on a 2 second timer.
 |Root CA certificate|Optional PEM used while certificate validation stays 
enabled. A `gs://` path needs the Beam GCS filesystem on the worker.
 |Disable certificate validation|Unchecked by default. HTTPS validates the 
server certificate and hostname unless this is enabled.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
index c591eefddc..193c399f32 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/jsoninput.adoc
@@ -118,7 +118,7 @@ Results are not limited when set to zero.
 
 === JSONPath tab
 
-*Resolve variables in JSONPath* is enabled by default, including for existing 
pipelines. Clear it to use every extraction Path literally. This is required 
for root-array paths such as `$[0].similarity`, whose `$[0]` otherwise has a 
meaning in Hop variable resolution. Clearing it also disables `${VARIABLE}` 
substitution inside extraction paths. File and URL settings continue to resolve 
variables normally.
+*Resolve variables in JSONPath* is enabled by default, including for existing 
pipelines. Clear it to use every extraction Path literally. This is required 
for root-array paths such as `$[0].similarity`, whose `$[0]` otherwise has a 
meaning in Hop variable resolution. Clearing it also disables `+${VARIABLE}+` 
substitution inside extraction paths. File and URL settings continue to resolve 
variables normally.
 
 === Fields Tab
 
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
index f3a6c04d86..e926faeedb 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/pipeline-executor.adoc
@@ -89,8 +89,8 @@ The filename may contain variables (for example, you can use 
the built-in Intern
 *NOTE:* It must be considered that, by specifying the pipeline file name using 
this option, we can experience a little performance penalty because the 
pipeline that will be executed will be initialized at runtime and not during 
the initialization phase as usual. On the other side this option gives greater 
flexibility in specifying the pipeline filename dynamically and this could be 
useful for many use-cases.
 |Run configuration|Specify the Pipeline Run Configuration to be used for 
execution.
 |Stop after (milliseconds)|Maximum time to wait for each child pipeline 
execution attempt. Empty or 0 means wait indefinitely. When the time is reached 
the child pipeline is stopped and the execution-results stream reports a 
failure (`ExecutionResult=N`, `ExecutionNrErrors>=1`) for that attempt. The 
value may contain a variable.
-|Retry attempts on failure|Number of retries after a failed child pipeline 
execution attempt. `0` means no retries (default), so the transform executes 
the child once. The value can use integer shorthand and variables (for example 
`1,000`, `100k`, `1.5m`, `1e3`, `'${PIPELINE_RETRY_ATTEMPTS}'`).
-|Retry delay (milliseconds)|Delay between retry attempts. Empty or `0` means 
retry immediately. The delay happens only between attempts and is not part of 
the per-attempt stop-after timeout. The value can use integer shorthand and 
variables (for example `1,000`, `100k`, `1.5m`, `1e3`, 
`'${PIPELINE_RETRY_DELAY_MS}'`).
+|Retry attempts on failure|Number of retries after a failed child pipeline 
execution attempt. `0` means no retries (default), so the transform executes 
the child once. The value can use integer shorthand and variables (for example 
`1,000`, `100k`, `1.5m`, `1e3`, `+'${PIPELINE_RETRY_ATTEMPTS}'+`).
+|Retry delay (milliseconds)|Delay between retry attempts. Empty or `0` means 
retry immediately. The delay happens only between attempts and is not part of 
the per-attempt stop-after timeout. The value can use integer shorthand and 
variables (for example `1,000`, `100k`, `1.5m`, `1e3`, 
`+'${PIPELINE_RETRY_DELAY_MS}'+`).
 
 |===
 
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
index dd8e201f84..737f766e60 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-input.adoc
@@ -42,7 +42,7 @@ Hop-only schemes such as `s3://`, `azure://` or a named MinIO 
connection do not
 |Unique name of the transform in the pipeline.
 
 |Spark path (Hadoop URI)
-|File, directory or glob to read. Supports variables. Avoid `${PROJECT_HOME}` 
when running with a Spark project package: that variable points at the 
extracted definition files, not at data. Use a data variable such as `HOP_DATA` 
or an explicit `s3a://` / `hdfs://` URI instead.
+|File, directory or glob to read. Supports variables. Avoid 
`+${PROJECT_HOME}+` when running with a Spark project package: that variable 
points at the extracted definition files, not at data. Use a data variable such 
as `HOP_DATA` or an explicit `s3a://` / `hdfs://` URI instead.
 
 |Format
 |`csv` (default), `parquet`, `json`, `orc` or `text`. Any other Spark data 
source name is passed to `spark.read.format()` as is.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
index fa9b4f711e..f2e6fd7962 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/spark-file-output.adoc
@@ -44,7 +44,7 @@ See xref:pipeline/spark/paths-and-filesystems.adoc[Paths and 
file systems] for t
 |Unique name of the transform in the pipeline.
 
 |Spark path / directory (Hadoop URI)
-|Output directory or prefix. Supports variables. Avoid `${PROJECT_HOME}` when 
running with a Spark project package: that variable points at the extracted 
definition files, not at a data location. Use a data variable such as 
`HOP_DATA` or `OUTPUT_ROOT`, or an explicit `s3a://` / `hdfs://` URI. Can be 
left empty for a path-less sink such as `jdbc`, which is addressed entirely 
through *Extra options*.
+|Output directory or prefix. Supports variables. Avoid `+${PROJECT_HOME}+` 
when running with a Spark project package: that variable points at the 
extracted definition files, not at a data location. Use a data variable such as 
`HOP_DATA` or `OUTPUT_ROOT`, or an explicit `s3a://` / `hdfs://` URI. Can be 
left empty for a path-less sink such as `jdbc`, which is addressed entirely 
through *Extra options*.
 
 |Format
 |`csv` (default), `parquet`, `json`, `orc` or `text`. Any other Spark data 
source name is passed to `df.write.format()` as is, for example `jdbc`.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc
index 830ed3b5d6..133a48bd6a 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/watchfiles.adoc
@@ -122,7 +122,7 @@ Remote schemes use Hop's installed VFS providers; this 
plugin creates no SFTP, F
 Root resolution uses `HopVfs.getFileObject(resolvedPath, variables)`, 
preserving execution variables, metadata-driven connections and VFS namespaces.
 Subsequent operations resolve relative to that same root FileObject.
 Named connections are recommended, particularly on Hop Server. Relative paths 
follow the existing HopVfs working-directory rules;
-use an explicit variable such as `${PROJECT_HOME}` for a project-relative path.
+use an explicit variable such as `+${PROJECT_HOME}+` for a project-relative 
path.
 
 === Stability and coalescing
 
@@ -280,7 +280,7 @@ For local filenames containing a literal percent sign, 
`filename` is a file URI
 
 == Example
 
-The bundled `watch-files/watch-files.hpl` sample monitors 
`${PROJECT_HOME}/watch-files/input` and writes filename, event type, size and 
modification time to the log.
+The bundled `watch-files/watch-files.hpl` sample monitors 
`+${PROJECT_HOME}/watch-files/input+` and writes filename, event type, size and 
modification time to the log.
 Create or modify a CSV in that directory, wait for stability, then stop the 
pipeline.
 Restart it after adding a CSV while stopped to observe recovery.
 Its sibling `state` directory persists checkpoints.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc
index 7ff5567511..f963b08cfd 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/webservices.adoc
@@ -32,12 +32,12 @@ The Web Services Lookup transform performs a Web Services 
lookup using the Web S
 |Option|Description
 |Transform Name|Name of the transform this name has to be unique in a single 
pipeline.
 |URL|The location of the WSDL document.
-This is either an `http://` or `https://` URL, or a file, for example 
`${PROJECT_HOME}/wsdl/service.wsdl`.
+This is either an `http://` or `https://` URL, or a file, for example 
`+${PROJECT_HOME}/wsdl/service.wsdl+`.
 A file can be on any file system Hop can read: a local folder, a `file://` 
URL, S3, Azure, a named VFS connection and so on.
 Variables are resolved, both in the dialog and when the pipeline runs.
 |Browse... (button)|Select a WSDL file.
 Its location is put in the URL field and the WSDL is loaded, as with the Load 
button.
-A file in your project folder is kept relative to `${PROJECT_HOME}`, so the 
pipeline keeps working when the project moves.
+A file in your project folder is kept relative to `+${PROJECT_HOME}+`, so the 
pipeline keeps working when the project moves.
 |Load (button)|The load button loads the WSDL at the specified URL and tries 
to automatically populate the input and output tabs and fields.
 NOTE: If this doesn't work, you can still try to manually specify the input 
and output fields using the "Add Input" and "Add Output" buttons.
 |Operation|The operation of the web service to call.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc
index 28a05d7891..4168b5781b 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/technology/graph-databases/index.adoc
@@ -179,7 +179,7 @@ From Hop 2.20 on it works with every graph database above. 
Existing projects kee
 |Neo4j location |Graph database location
 |===
 * `HOP_GRAPH_LOGGING_CONNECTION` replaces `NEO4J_LOGGING_CONNECTION`, which 
keeps working when the new variable isn't set.
-* The Cypher builder writes parameters as `$name`. It wrote them as `{name}`, 
which Neo4j 4 and later reject, so statements without UNWIND work again.
+* The Cypher builder writes parameters as `$name`. It wrote them as 
`+{name}+`, which Neo4j 4 and later reject, so statements without UNWIND work 
again.
 * Get graph logging info finds the previous executions of pipelines and 
workflows: it looked for execution types which the logging doesn't write.
 The workflow logging now writes the status of a workflow, which these lookups 
need.
 * The graph index, graph constraint, graph script and check connections 
actions report their own success, also after a failure hop.
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
 
b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
index 629a1630a1..129e8d4bf8 100644
--- 
a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
+++ 
b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-constraint.adoc
@@ -39,7 +39,7 @@ For similar operations on indexes, check the 
xref:workflow/actions/graph-index.a
 ** Object name: the label of the node or relationship you want to update a 
constraint for
 ** Property: the property to put the constraint on (for NODE_KEY, use 
comma-separated properties like "id,name")
 
-The constraint name, object name and properties can be variables, for example 
`${PERSON_KEY}`.
+The constraint name, object name and properties can be variables, for example 
`+${PERSON_KEY}+`.
 The action resolves them before it builds the statement, for create and drop, 
and the Cypher preview shows the resolved values.
 
 [NOTE]
diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc
index ae37987fe6..6ea5dae87c 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/workflow/actions/graph-index.adoc
@@ -42,7 +42,7 @@ For similar operations on constraints, check the 
xref:workflow/actions/graph-con
 ** Vector similarity: VECTOR only, COSINE (the default) or EUCLIDEAN
 ** Vector capacity: VECTOR on Memgraph only, the number of vectors to reserve 
room for, 1000 when empty
 
-The index name, object name, properties, vector dimensions and vector capacity 
can be variables, for example `${CHUNK_INDEX}` to keep a test and a production 
index apart.
+The index name, object name, properties, vector dimensions and vector capacity 
can be variables, for example `+${CHUNK_INDEX}+` to keep a test and a 
production index apart.
 The action resolves them before it builds the statement, for create and drop, 
and the Cypher preview shows the resolved values.
 Use the same variable for the index name in 
xref:pipeline/transforms/graph-vector-search.adoc[Graph vector search].
 

Reply via email to