Enforce the new category and effect tags.

All options need to explicitly list their category and effect. If they are uncategorized, this makes the lack of information obvious. Remove defaults from the annotation to enforce this.

Also enforce the sanity check that no option should have UNKNOWN or NO_OP effects listed with other effect tags.

Includes some last default sets for options I missed in the previous mass-setting change, and some that were added since.

PiperOrigin-RevId: 160641861
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/BUILD
index a20987f..eaf4ed6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/BUILD
@@ -19,6 +19,7 @@
         "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//third_party:auto_value",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyOptions.java
index 2b43fc2..4bfbacb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyOptions.java
@@ -17,7 +17,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionsParser.OptionUsageRestrictions;
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.util.List;
 
 /** The options fragment which defines {@link FeaturePolicyConfiguration}. */
@@ -34,6 +36,8 @@
             + "features, but each feature must be specified only once.",
     valueHelp = "a feature=label pair",
     optionUsageRestrictions = OptionUsageRestrictions.UNDOCUMENTED,
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     converter = PolicyEntryConverter.class,
     defaultValue = "n/a (default ignored for allowMultiple)",
     allowMultiple = true
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteOptions.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteOptions.java
index d472ada..203128d 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteOptions.java
@@ -159,6 +159,8 @@
     name = "experimental_remote_retry",
     defaultValue = "true",
     category = "remote",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "Whether to retry transient remote execution/cache errors."
   )
   public boolean experimentalRemoteRetry;
@@ -167,6 +169,8 @@
     name = "experimental_remote_retry_start_delay_millis",
     defaultValue = "100",
     category = "remote",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "The initial delay before retrying a transient error."
   )
   public long experimentalRemoteRetryStartDelayMillis;
@@ -175,6 +179,8 @@
     name = "experimental_remote_retry_max_delay_millis",
     defaultValue = "5000",
     category = "remote",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "The maximum delay before retrying a transient error."
   )
   public long experimentalRemoteRetryMaxDelayMillis;
@@ -183,6 +189,8 @@
     name = "experimental_remote_retry_max_attempts",
     defaultValue = "5",
     category = "remote",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "The maximum number of attempts to retry a transient error."
   )
   public int experimentalRemoteRetryMaxAttempts;
@@ -191,6 +199,8 @@
     name = "experimental_remote_retry_multiplier",
     defaultValue = "2",
     category = "remote",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "The multiplier by which to increase the retry delay on transient errors."
   )
   public double experimentalRemoteRetryMultiplier;
@@ -199,6 +209,8 @@
     name = "experimental_remote_retry_jitter",
     defaultValue = "0.1",
     category = "remote",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "The random factor to apply to retry delays on transient errors."
   )
   public double experimentalRemoteRetryJitter;
diff --git a/src/main/java/com/google/devtools/common/options/IsolatedOptionsData.java b/src/main/java/com/google/devtools/common/options/IsolatedOptionsData.java
index 2d3b4ce..6f682ea 100644
--- a/src/main/java/com/google/devtools/common/options/IsolatedOptionsData.java
+++ b/src/main/java/com/google/devtools/common/options/IsolatedOptionsData.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Ordering;
 import com.google.devtools.common.options.OptionsParser.ConstructionException;
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -360,6 +361,35 @@
     booleanAliasMap.put("no" + optionName, optionName);
   }
 
+  private static void checkEffectTagRationality(String optionName, OptionEffectTag[] effectTags) {
+    // Check that there is at least one OptionEffectTag listed.
+    if (effectTags.length < 1) {
+      throw new ConstructionException(
+          "Option "
+              + optionName
+              + " does not list at least one OptionEffectTag. If the option has no effect, "
+              + "please add NO_OP, otherwise, add a tag representing its effect.");
+    } else if (effectTags.length > 1) {
+      // If there are more than 1 tag, make sure that NO_OP and UNKNOWN is not one of them.
+      // These don't make sense if other effects are listed.
+      ImmutableList<OptionEffectTag> tags = ImmutableList.copyOf(effectTags);
+      if (tags.contains(OptionEffectTag.UNKNOWN)) {
+        throw new ConstructionException(
+            "Option "
+                + optionName
+                + " includes UNKNOWN with other, known, effects. Please remove UNKNOWN from "
+                + "the list.");
+      }
+      if (tags.contains(OptionEffectTag.NO_OP)) {
+        throw new ConstructionException(
+            "Option "
+                + optionName
+                + " includes NO_OP with other effects. This doesn't make much sense. Please "
+                + "remove NO_OP or the actual effects from the list, whichever is correct.");
+      }
+    }
+  }
+
   /**
    * Constructs an {@link IsolatedOptionsData} object for a parser that knows about the given
    * {@link OptionsBase} classes. No inter-option analysis is done. Performs basic sanity checking
@@ -407,6 +437,8 @@
                   + annotation.category() + "\" in option \"" + optionName + "\" is disallowed.");
         }
 
+        checkEffectTagRationality(optionName, annotation.effectTags());
+
         Type fieldType = getFieldSingularType(field, annotation);
         // For simple, static expansions, don't accept non-Void types.
         if (annotation.expansion().length != 0 && !isVoidField(field)) {
diff --git a/src/main/java/com/google/devtools/common/options/Option.java b/src/main/java/com/google/devtools/common/options/Option.java
index 7489bd6..e6c9207 100644
--- a/src/main/java/com/google/devtools/common/options/Option.java
+++ b/src/main/java/com/google/devtools/common/options/Option.java
@@ -92,24 +92,23 @@
    *
    * <p>For undocumented flags that aren't listed anywhere, this is currently a no-op. Feel free to
    * set the value that it would have if it were documented, which might be helpful if a flag is
-   * part of an experimental feature that might become documented in the future, or just leave it
-   * unset as the default.
+   * part of an experimental feature that might become documented in the future, or just leave it as
+   * OptionDocumentationCategory.UNCATEGORIZED.
    *
    * <p>For hidden or internal options, use the category field only if it is helpful for yourself or
    * other Bazel developers.
    */
-  OptionDocumentationCategory documentationCategory() default
-      OptionDocumentationCategory.UNCATEGORIZED;
+  OptionDocumentationCategory documentationCategory();
 
   /**
    * Tag about the intent or effect of this option. Unless this option is a no-op (and the reason
    * for this should be documented) all options should have some effect, so this needs to have at
    * least one value.
    *
-   * <p>No option should list NO_OP_OR_UNKNOWN with other effects listed, but all other combinations
+   * <p>No option should list NO_OP or UNKNOWN with other effects listed, but all other combinations
    * are allowed.
    */
-  OptionEffectTag[] effectTags() default {OptionEffectTag.UNKNOWN};
+  OptionEffectTag[] effectTags();
 
   /**
    * Tag about the state of this option, such as if it gates an experimental feature, or is
diff --git a/src/objc_tools/plmerge/BUILD b/src/objc_tools/plmerge/BUILD
index 49aafc2..acaeb9a 100644
--- a/src/objc_tools/plmerge/BUILD
+++ b/src/objc_tools/plmerge/BUILD
@@ -8,6 +8,7 @@
     deps = [
         ":plmerge_lib",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//src/main/protobuf:plmerge_java_proto",
         "//third_party:guava",
         "//third_party/java/dd_plist",
@@ -21,6 +22,7 @@
     ),
     deps = [
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//src/main/protobuf:plmerge_java_proto",
         "//src/tools/xcode-common/java/com/google/devtools/build/xcode/common",
         "//src/tools/xcode-common/java/com/google/devtools/build/xcode/util",
diff --git a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java
index 8f9f558..8b24917e 100644
--- a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java
+++ b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java
@@ -17,11 +17,12 @@
 import com.google.common.base.Strings;
 import com.google.devtools.build.xcode.plmerge.proto.PlMergeProtos.Control;
 import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.Options;
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.FileSystem;
@@ -44,6 +45,8 @@
     @Option(
       name = "control",
       help = "Absolute path of the Control protobuf.",
+      documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+      effectTags = {OptionEffectTag.UNKNOWN},
       defaultValue = "null"
     )
     public String controlPath;
diff --git a/src/test/java/com/google/devtools/common/options/OptionsParserTest.java b/src/test/java/com/google/devtools/common/options/OptionsParserTest.java
index 64d2d24..f931be3 100644
--- a/src/test/java/com/google/devtools/common/options/OptionsParserTest.java
+++ b/src/test/java/com/google/devtools/common/options/OptionsParserTest.java
@@ -1024,7 +1024,13 @@
       }
     }
 
-    @Option(name = "badness", expansionFunction = ExpFunc.class, defaultValue = "null")
+    @Option(
+      name = "badness",
+      expansionFunction = ExpFunc.class,
+      documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+      effectTags = {OptionEffectTag.NO_OP},
+      defaultValue = "null"
+    )
     public String badness;
   }
 
@@ -1080,7 +1086,13 @@
 
   /** ExpansionMultipleOptions */
   public static class ExpansionMultipleOptions extends OptionsBase {
-    @Option(name = "underlying", defaultValue = "null", allowMultiple = true)
+    @Option(
+      name = "underlying",
+      defaultValue = "null",
+      documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+      effectTags = {OptionEffectTag.NO_OP},
+      allowMultiple = true
+    )
     public List<String> underlying;
 
     /** ExpFunc */
@@ -1097,7 +1109,13 @@
       }
     }
 
-    @Option(name = "expands_by_function", defaultValue = "null", expansionFunction = ExpFunc.class)
+    @Option(
+      name = "expands_by_function",
+      defaultValue = "null",
+      documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+      effectTags = {OptionEffectTag.NO_OP},
+      expansionFunction = ExpFunc.class
+    )
     public Void expandsByFunction;
   }
 
diff --git a/src/test/java/com/google/devtools/common/options/TestOptions.java b/src/test/java/com/google/devtools/common/options/TestOptions.java
index 9e79e85..c73009b 100644
--- a/src/test/java/com/google/devtools/common/options/TestOptions.java
+++ b/src/test/java/com/google/devtools/common/options/TestOptions.java
@@ -247,6 +247,8 @@
   @Option(
     name = "test_expansion_function",
     defaultValue = "null",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.NO_OP},
     expansionFunction = TestExpansionFunction.class
   )
   public Void testExpansionFunction;
@@ -264,6 +266,8 @@
   @Option(
     name = "test_void_expansion_function",
     defaultValue = "null",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.NO_OP},
     expansionFunction = TestVoidExpansionFunction.class
   )
   public Void testVoidExpansionFunction;
diff --git a/src/tools/benchmark/java/com/google/devtools/build/benchmark/BUILD b/src/tools/benchmark/java/com/google/devtools/build/benchmark/BUILD
index b44c70f..6dae2a1 100644
--- a/src/tools/benchmark/java/com/google/devtools/build/benchmark/BUILD
+++ b/src/tools/benchmark/java/com/google/devtools/build/benchmark/BUILD
@@ -19,6 +19,7 @@
         "//src/main/java/com/google/devtools/build/lib:shell",
         "//src/main/java/com/google/devtools/build/lib:vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator:codegenerator_lib",
         "//third_party:auto_value",
         "//third_party:guava",
@@ -36,6 +37,7 @@
         "//src/main/java/com/google/devtools/build/lib:shell",
         "//src/main/java/com/google/devtools/build/lib:vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator:codegenerator_lib",
         "//third_party:auto_value",
         "//third_party:guava",
diff --git a/src/tools/benchmark/java/com/google/devtools/build/benchmark/BenchmarkOptions.java b/src/tools/benchmark/java/com/google/devtools/build/benchmark/BenchmarkOptions.java
index 971e55e..840ae74 100644
--- a/src/tools/benchmark/java/com/google/devtools/build/benchmark/BenchmarkOptions.java
+++ b/src/tools/benchmark/java/com/google/devtools/build/benchmark/BenchmarkOptions.java
@@ -15,58 +15,69 @@
 package com.google.devtools.build.benchmark;
 
 import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionsBase;
-
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.util.List;
 
 /** Class that contains arguments for running the benchmark. */
 public class BenchmarkOptions extends OptionsBase {
 
   @Option(
-      name = "workspace",
-      defaultValue = "",
-      category = "benchmark",
-      valueHelp = "path",
-      help = "Directory where we put all the code and results."
+    name = "workspace",
+    defaultValue = "",
+    category = "benchmark",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    valueHelp = "path",
+    help = "Directory where we put all the code and results."
   )
   public String workspace;
 
   @Option(
-      name = "output",
-      defaultValue = "",
-      category = "benchmark",
-      valueHelp = "path",
-      help = "Path to put benchmark result (json format)."
+    name = "output",
+    defaultValue = "",
+    category = "benchmark",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    valueHelp = "path",
+    help = "Path to put benchmark result (json format)."
   )
   public String output;
 
   @Option(
-      name = "version_between",
-      defaultValue = "",
-      category = "version filter",
-      valueHelp = "string",
-      help = "Use code versions between two versions, eg. 'abcedf..uvwxyz'.",
-      converter = VersionFilterConverter.class
+    name = "version_between",
+    defaultValue = "",
+    category = "version filter",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    valueHelp = "string",
+    help = "Use code versions between two versions, eg. 'abcedf..uvwxyz'.",
+    converter = VersionFilterConverter.class
   )
   public VersionFilter versionFilter;
 
   @Option(
-      name = "time_between",
-      defaultValue = "",
-      category = "time filter",
-      valueHelp = "string",
-      help = "Use code versions between two time, eg. '2017-01-01 13:00..2017-01-02 08:00'.",
-      converter = DateFilterConverter.class
+    name = "time_between",
+    defaultValue = "",
+    category = "time filter",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    valueHelp = "string",
+    help = "Use code versions between two time, eg. '2017-01-01 13:00..2017-01-02 08:00'.",
+    converter = DateFilterConverter.class
   )
   public DateFilter dateFilter;
 
   @Option(
-      name = "versions",
-      defaultValue = "",
-      category = "version",
-      valueHelp = "list of strings",
-      allowMultiple = true,
-      help = "Use code versions as listed."
+    name = "versions",
+    defaultValue = "",
+    category = "version",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    valueHelp = "list of strings",
+    allowMultiple = true,
+    help = "Use code versions as listed."
   )
   public List<String> versions;
 }
diff --git a/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/BUILD b/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/BUILD
index 76a2ad8..763b9da 100644
--- a/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/BUILD
+++ b/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/BUILD
@@ -6,6 +6,7 @@
     main_class = "com.google.devtools.build.benchmark.codegenerator.Main",
     deps = [
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//third_party:guava",
         "//third_party/java/javapoet",
     ],
@@ -16,6 +17,7 @@
     srcs = glob(["*.java"]),
     deps = [
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//third_party:guava",
         "//third_party/java/javapoet",
     ],
diff --git a/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/GeneratorOptions.java b/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/GeneratorOptions.java
index 59c8283..6524fad 100644
--- a/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/GeneratorOptions.java
+++ b/src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator/GeneratorOptions.java
@@ -15,8 +15,9 @@
 package com.google.devtools.build.benchmark.codegenerator;
 
 import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionsBase;
-
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.util.List;
 
 /** Class that contains arguments for the java files generator. */
@@ -26,6 +27,8 @@
     name = "modify",
     defaultValue = "false",
     category = "generator",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.NO_OP},
     help = "if we modify the existing code (or generate new code)."
   )
   public boolean modificationMode;
@@ -34,18 +37,23 @@
     name = "output_dir",
     defaultValue = "",
     category = "generator",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.NO_OP},
     valueHelp = "path",
     help = "directory where we put generated code or modify the existing code."
   )
   public String outputDir;
 
   @Option(
-      name = "project_name",
-      defaultValue = "",
-      category = "generator",
-      allowMultiple = true,
-      help = "which project we should generate,"
-          + " available: AFewFiles, ManyFiles, LongChainedDeps, ParallelDeps"
+    name = "project_name",
+    defaultValue = "",
+    category = "generator",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.NO_OP},
+    allowMultiple = true,
+    help =
+        "which project we should generate,"
+            + " available: AFewFiles, ManyFiles, LongChainedDeps, ParallelDeps"
   )
   public List<String> projectNames;
 }
diff --git a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/BUILD b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/BUILD
index ee318dc..fcd4d00 100644
--- a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/BUILD
+++ b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/BUILD
@@ -13,6 +13,7 @@
         "//src/main/java/com/google/devtools/build/lib:unix",
         "//src/main/java/com/google/devtools/build/lib:vfs",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven",
         "//src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/maven:rule",
         "//third_party:guava",
diff --git a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/GenerateWorkspaceOptions.java b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/GenerateWorkspaceOptions.java
index 7e9011b..6dcd77a 100644
--- a/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/GenerateWorkspaceOptions.java
+++ b/src/tools/generate_workspace/src/main/java/com/google/devtools/build/workspace/GenerateWorkspaceOptions.java
@@ -15,8 +15,9 @@
 package com.google.devtools.build.workspace;
 
 import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionsBase;
-
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.util.List;
 
 /**
@@ -24,51 +25,61 @@
  */
 public class GenerateWorkspaceOptions extends OptionsBase {
   @Option(
-      name = "help",
-      abbrev = 'h',
-      help = "Prints usage info.",
-      defaultValue = "true"
+    name = "help",
+    abbrev = 'h',
+    help = "Prints usage info.",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    defaultValue = "true"
   )
   public boolean help;
 
   @Option(
-      name = "bazel_project",
-      abbrev = 'b',
-      help = "Directory contains a Bazel project.",
-      allowMultiple = true,
-      category = "input",
-      defaultValue = ""
+    name = "bazel_project",
+    abbrev = 'b',
+    help = "Directory contains a Bazel project.",
+    allowMultiple = true,
+    category = "input",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    defaultValue = ""
   )
   public List<String> bazelProjects;
 
   @Option(
-      name = "maven_project",
-      abbrev = 'm',
-      help = "Directory containing a Maven project.",
-      allowMultiple = true,
-      category = "input",
-      defaultValue = ""
+    name = "maven_project",
+    abbrev = 'm',
+    help = "Directory containing a Maven project.",
+    allowMultiple = true,
+    category = "input",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    defaultValue = ""
   )
   public List<String> mavenProjects;
 
   @Option(
-      name = "artifact",
-      abbrev = 'a',
-      help = "Maven artifact coordinates (e.g. groupId:artifactId:version).",
-      allowMultiple = true,
-      category = "input",
-      defaultValue = ""
+    name = "artifact",
+    abbrev = 'a',
+    help = "Maven artifact coordinates (e.g. groupId:artifactId:version).",
+    allowMultiple = true,
+    category = "input",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    defaultValue = ""
   )
   public List<String> artifacts;
-  
+
   @Option(
-      name = "output_dir",
-      abbrev = 'o',
-      help = "Output directory to store the WORKSPACE and BUILD files. If unspecified, a temporary"
-          + " directory is used.",
-      category = "output",
-      defaultValue = ""
+    name = "output_dir",
+    abbrev = 'o',
+    help =
+        "Output directory to store the WORKSPACE and BUILD files. If unspecified, a temporary"
+            + " directory is used.",
+    category = "output",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
+    defaultValue = ""
   )
   public String outputDir;
-
 }
diff --git a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD
index 9104f3c..7e85b24 100644
--- a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD
+++ b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/BUILD
@@ -27,6 +27,7 @@
         "//src/main/java/com/google/devtools/build/lib:vfs",
         "//src/main/java/com/google/devtools/build/lib/remote",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/protobuf:option_filters_java_proto",
         "//third_party:guava",
         "//third_party:hazelcast",
         "//third_party:netty",
diff --git a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java
index bb8e976..686761f 100644
--- a/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java
+++ b/src/tools/remote_worker/src/main/java/com/google/devtools/build/remote/RemoteWorkerOptions.java
@@ -15,7 +15,9 @@
 package com.google.devtools.build.remote;
 
 import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.OptionDocumentationCategory;
 import com.google.devtools.common.options.OptionsBase;
+import com.google.devtools.common.options.proto.OptionFilters.OptionEffectTag;
 import java.util.List;
 
 /** Options for remote worker. */
@@ -24,6 +26,8 @@
     name = "listen_port",
     defaultValue = "8080",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "Listening port for the netty server."
   )
   public int listenPort;
@@ -32,6 +36,8 @@
     name = "work_path",
     defaultValue = "null",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "A directory for the build worker to do work."
   )
   public String workPath;
@@ -40,6 +46,8 @@
     name = "debug",
     defaultValue = "false",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help =
         "Turn this on for debugging remote job failures. There will be extra messages and the "
             + "work directory will be preserved in the case of failure."
@@ -50,6 +58,8 @@
     name = "pid_file",
     defaultValue = "null",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "File for writing the process id for this worker when it is fully started."
   )
   public String pidFile;
@@ -58,6 +68,8 @@
     name = "sandboxing",
     defaultValue = "false",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "If supported on this platform, use sandboxing for increased hermeticity."
   )
   public boolean sandboxing;
@@ -66,6 +78,8 @@
     name = "sandboxing_writable_path",
     defaultValue = "",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     allowMultiple = true,
     help = "When using sandboxing, allow running actions to write to this path."
   )
@@ -75,6 +89,8 @@
     name = "sandboxing_tmpfs_dir",
     defaultValue = "",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     allowMultiple = true,
     help = "When using sandboxing, mount an empty tmpfs onto this path for each running action."
   )
@@ -84,6 +100,8 @@
     name = "sandboxing_block_network",
     defaultValue = "false",
     category = "build_worker",
+    documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
+    effectTags = {OptionEffectTag.UNKNOWN},
     help = "When using sandboxing, block network access for running actions."
   )
   public boolean sandboxingBlockNetwork;