diff --git a/dvc/stage.py b/dvc/stage.py
--- a/dvc/stage.py
+++ b/dvc/stage.py
@@ -629,12 +629,16 @@ def load(repo, fname):
 
     def dumpd(self):
         rel_wdir = relpath(self.wdir, os.path.dirname(self.path))
+
+        wdir = pathlib.PurePath(rel_wdir).as_posix()
+        wdir = wdir if wdir != "." else None
+
         return {
             key: value
             for key, value in {
                 Stage.PARAM_MD5: self.md5,
                 Stage.PARAM_CMD: self.cmd,
-                Stage.PARAM_WDIR: pathlib.PurePath(rel_wdir).as_posix(),
+                Stage.PARAM_WDIR: wdir,
                 Stage.PARAM_LOCKED: self.locked,
                 Stage.PARAM_DEPS: [d.dumpd() for d in self.deps],
                 Stage.PARAM_OUTS: [o.dumpd() for o in self.outs],

@efiop , related? https://github.com/iterative/dvc/issues/2210
What is the reasoning for not writing `wdir`? We actually have [test](https://github.com/iterative/dvc/blob/41351a2df2f36ed04846d5e3d976d6d99b71a151/tests/func/test_run.py#L563) checking that wdir `.` is written.
diff --git a/tests/func/test_run.py b/tests/func/test_run.py
--- a/tests/func/test_run.py
+++ b/tests/func/test_run.py
@@ -560,18 +560,18 @@ def test_not_cached(self):
 
 
 class TestCmdRunWorkingDirectory(TestDvc):
-    def test_default_wdir_is_written(self):
+    def test_default_wdir_is_not_written(self):
         stage = self.dvc.run(
             cmd="echo test > {}".format(self.FOO), outs=[self.FOO], wdir="."
         )
         d = load_stage_file(stage.relpath)
-        self.assertEqual(d[Stage.PARAM_WDIR], ".")
+        self.assertNotIn(Stage.PARAM_WDIR, d.keys())
 
         stage = self.dvc.run(
             cmd="echo test > {}".format(self.BAR), outs=[self.BAR]
         )
         d = load_stage_file(stage.relpath)
-        self.assertEqual(d[Stage.PARAM_WDIR], ".")
+        self.assertNotIn(Stage.PARAM_WDIR, d.keys())
 
     def test_fname_changes_path_and_wdir(self):
         dname = "dir"
diff --git a/tests/func/test_stage.py b/tests/func/test_stage.py
--- a/tests/func/test_stage.py
+++ b/tests/func/test_stage.py
@@ -102,16 +102,10 @@ def test_ignored_in_checksum(self):
         )
 
         d = stage.dumpd()
-        self.assertEqual(d[stage.PARAM_WDIR], ".")
+        self.assertNotIn(Stage.PARAM_WDIR, d.keys())
 
         d = load_stage_file(stage.relpath)
-        self.assertEqual(d[stage.PARAM_WDIR], ".")
-
-        del d[stage.PARAM_WDIR]
-        dump_stage_file(stage.relpath, d)
-
-        d = load_stage_file(stage.relpath)
-        self.assertIsNone(d.get(stage.PARAM_WDIR))
+        self.assertNotIn(Stage.PARAM_WDIR, d.keys())
 
         with self.dvc.state:
             stage = Stage.load(self.dvc, stage.relpath)

stage: don't write default wdir
https://github.com/iterative/dvc/blob/0.57.0/dvc/stage.py#L632

`.` doesn't evaluate to False and so not skipped.

tests/func/test_run.py::TestCmdRunWorkingDirectory::test_default_wdir_is_not_written tests/func/test_stage.py::TestDefaultWorkingDirectory::test_ignored_in_checksum
tests/func/test_run.py::TestRun::test tests/func/test_run.py::TestRunEmpty::test tests/func/test_run.py::TestRunMissingDep::test tests/func/test_run.py::TestRunBadStageFilename::test tests/func/test_run.py::TestRunNoExec::test tests/func/test_run.py::TestRunCircularDependency::test tests/func/test_run.py::TestRunCircularDependency::test_graph tests/func/test_run.py::TestRunCircularDependency::test_non_normalized_paths tests/func/test_run.py::TestRunCircularDependency::test_outs_no_cache tests/func/test_run.py::TestRunDuplicatedArguments::test tests/func/test_run.py::TestRunDuplicatedArguments::test_non_normalized_paths tests/func/test_run.py::TestRunDuplicatedArguments::test_outs_no_cache tests/func/test_run.py::TestRunStageInsideOutput::test_cwd tests/func/test_run.py::TestRunStageInsideOutput::test_file_name tests/func/test_run.py::TestRunBadCwd::test tests/func/test_run.py::TestRunBadCwd::test_same_prefix tests/func/test_run.py::TestRunBadWdir::test tests/func/test_run.py::TestRunBadWdir::test_not_dir tests/func/test_run.py::TestRunBadWdir::test_not_found tests/func/test_run.py::TestRunBadWdir::test_same_prefix tests/func/test_run.py::TestRunBadName::test tests/func/test_run.py::TestRunBadName::test_not_found tests/func/test_run.py::TestRunBadName::test_same_prefix tests/func/test_run.py::TestRunRemoveOuts::test tests/func/test_run.py::TestCmdRunOverwrite::test tests/func/test_run.py::TestCmdRunCliMetrics::test_cached tests/func/test_run.py::TestCmdRunCliMetrics::test_not_cached tests/func/test_run.py::TestCmdRunWorkingDirectory::test_cwd_is_ignored tests/func/test_run.py::TestCmdRunWorkingDirectory::test_fname_changes_path_and_wdir tests/func/test_run.py::test_run_deterministic tests/func/test_run.py::test_run_deterministic_overwrite tests/func/test_run.py::test_run_deterministic_callback tests/func/test_run.py::test_run_deterministic_changed_dep tests/func/test_run.py::test_run_deterministic_changed_deps_list tests/func/test_run.py::test_run_deterministic_new_dep tests/func/test_run.py::test_run_deterministic_remove_dep tests/func/test_run.py::test_run_deterministic_changed_out tests/func/test_run.py::test_run_deterministic_changed_cmd tests/func/test_run.py::TestRunCommit::test tests/func/test_run.py::TestRunPersistOuts::test tests/func/test_run.py::TestRunPersistOutsNoCache::test tests/func/test_run.py::TestShouldRaiseOnOverlappingOutputPaths::test tests/func/test_run.py::TestNewRunShouldRemoveOutsOnNoPersist::test tests/func/test_run.py::TestNewRunShouldNotRemoveOutsOnPersist::test tests/func/test_run.py::TestShouldNotCheckoutUponCorruptedLocalHardlinkCache::test tests/func/test_run.py::TestPersistentOutput::test_ignore_build_cache tests/func/test_run.py::test_bad_stage_fname tests/func/test_stage.py::TestSchemaCmd::test_cmd_none tests/func/test_stage.py::TestSchemaCmd::test_cmd_object tests/func/test_stage.py::TestSchemaCmd::test_cmd_str tests/func/test_stage.py::TestSchemaCmd::test_no_cmd tests/func/test_stage.py::TestSchemaDepsOuts::test_empty_list tests/func/test_stage.py::TestSchemaDepsOuts::test_list tests/func/test_stage.py::TestSchemaDepsOuts::test_none tests/func/test_stage.py::TestSchemaDepsOuts::test_object tests/func/test_stage.py::TestReload::test tests/func/test_stage.py::TestExternalRemoteResolution::test_remote_dependency tests/func/test_stage.py::TestExternalRemoteResolution::test_remote_output tests/func/test_stage.py::test_md5_ignores_comments tests/func/test_stage.py::test_meta_is_preserved