SQL Server DefaultDataPath and DefaultLogPath are not loaded properly when publishing from SqlPackage on Linux to a SQL Server on Linux
Nobody has claimed this yet.
- Dominant language
- C#
- Stars
- 460
- Forks
- 29
- Avg merge
- 4d 9h
- Merged PRs (30d)
- 7
Description
- SqlPackage or DacFx Version: 170.2.70.1 (Also tested with 161.8089.0)
- .NET Framework (Windows-only) or .NET Core: .NET 9.0.111 (Also tested with .NET 8.0.415)
- Environment (local platform and source/target platforms): SqlPackage run on Ubuntu 24.04 (also tried with Ubuntu Server 24.04). Target is SQL Server 2025 preview on Ubuntu Server 24.04.
**Steps to Reproduce:**
1. Download and install SQL Server 2025 on a Linux machine. Configure the default data path and the default log path to /sql_data and /sql_log respectively. Ensure read and write permissions are granted to the mssql user.
2. Using SSMS or Azure Data Studio, create a database (TestDb) on the server and make sure the mdf and ldf files are created in the new default directories.
3. Publish a DACPAC to the target server (does not matter if you use a connection string or the Target properties) with Diagnostics enabled and Verbose set to true. You should see the following output:
...
```
Microsoft.Data.Tools.Diagnostics.Tracer Verbose: 0 : 2025-10-27T16:03:26 : Executing Step 2, Not Tracked, Type 'DeploymentScriptDomStep', Section 'Header', Operation '0', Ignorable Errors 'None', Script is as follows:
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;
Microsoft.Data.Tools.Diagnostics.Tracer Error: 0 : 2025-10-27T16:03:26 : Error parsing script when attempting to mask sensitive data. Returning script as is. Error:
Incorrect syntax near :.
Microsoft.Data.Tools.Diagnostics.Tracer Verbose: 0 : 2025-10-27T16:03:26 : Executing Step 3, Not Tracked, Type 'DeploymentScriptStep', Section 'Header', Script is as follows:
:setvar DefaultDataPath "/"
:setvar DefaultLogPath "/"
:setvar DatabaseName "FooDatabase"
:setvar DefaultFilePrefix "FooDatabase"
Microsoft.Data.Tools.Diagnostics.Tracer Error: 0 : 2025-10-27T16:03:26 : Error parsing script when attempting to mask sensitive data. Returning script as is. Error:
Incorrect syntax near :.
```
^^Here we see the DefaultDataPath and DefaultLogPath set to the root folder, instead of our /sql_data and /sql_log folders. After this, it tries to create the database in the root folder using those variables:
```
Microsoft.Data.Tools.Diagnostics.Tracer Verbose: 0 : 2025-10-27T16:03:26 : Executing Step 9, Not Tracked, Type 'DeploymentScriptDomStep', Section 'Master', Operation '0', Ignorable Errors 'None', Script is as follows:
PRINT N'Creating database $(DatabaseName)...';
Creating database FooDatabase...
Microsoft.Data.Tools.Diagnostics.Tracer Verbose: 0 : 2025-10-27T16:03:26 : Executing Step 10, Not Tracked, Type 'SqlCreateDatabaseStep', Section 'Master', Operation '0', Ignorable Errors '1801,45166', Script is as follows:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
Microsoft.Data.Tools.Diagnostics.Tracer Error: 19 : 2025-10-27T16:03:26 : Retry requested: Retry count = 1. Delay = 00:00:00, SQL Error Code = -2146232060, SQL Error Number = 5123, Can retry error = False, Will retry = False Microsoft.Data.SqlClient.SqlException (0x80131904): CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file '/FooDatabase_Primary.mdf'.
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()
at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at Microsoft.Data.Tools.Schema.Common.SqlClient.ReliableSqlConnection.<>c__DisplayClass54_0.b__0() in C:\__w\1\s\Source\SchemaSql\Common\SqlClient\ReliableSqlConnection.cs:line 522
at Microsoft.Data.Tools.Schema.Common.SqlClient.ReliableSqlConnection.<>c__DisplayClass60_0`1.b__0(RetryState state) in C:\__w\1\s\Source\SchemaSql\Common\SqlClient\ReliableSqlConnection.cs:line 656
at Microsoft.Data.Tools.Schema.Common.SqlClient.RetryPolicy.ExecuteAction[R](Func`2 func, Nullable`1 token) in C:\__w\1\s\Source\SchemaSql\Common\SqlClient\RetryPolicy.cs:line 189
ClientConnectionId:f05c945e-2595-4939-bcdd-5c19036254ee
Error Number:5123,State:1,Class:16
Microsoft.Data.Tools.Diagnostics.Tracer Error: 0 : 2025-10-27T16:03:26 : Core Microsoft SqlClient Data Provider: Msg 5123, Level 16, State 1, Line 1 CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file '/FooDatabase_Primary.mdf'.
Microsoft.Data.Tools.Diagnostics.Tracer Error: 0 : 2025-10-27T16:03:26 : Script execution error. The executed script:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
Microsoft.Data.Tools.Diagnostics.Tracer Error: 0 : 2025-10-27T16:03:26 : Core Microsoft SqlClient Data Provider: Msg 1802, Level 16, State 4, Line 1 CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
Microsoft.Data.Tools.Diagnostics.Tracer Error: 0 : 2025-10-27T16:03:26 : Script execution error. The executed script:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
An error occurred while the batch was being executed.
Microsoft.Data.Tools.Diagnostics.Tracer Error: 19 : 2025-10-27T16:03:26 : Microsoft.SqlServer.Dac.DacServicesException: Could not deploy package.
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 5123, Level 16, State 1, Line 1 CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file '/FooDatabase_Primary.mdf'.
Error SQL72045: Script execution error. The executed script:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 1802, Level 16, State 4, Line 1 CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
Error SQL72045: Script execution error. The executed script:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
Microsoft.Data.Tools.Diagnostics.Tracer Verbose: 25 : 2025-10-27T16:03:26 : Perf: Operation ended (name, details, elapsed in ms): Updating database,,366
Updating database (Failed)
Microsoft.Data.Tools.Diagnostics.Tracer Information: 24 : 2025-10-27T16:03:26 :
Telemetry event: DacFxOperationEnd,
common properties: name: [DacFxVersion, 170.2.70.1], value: 0,name: [ApplicationName, sqlpackage], value: 1,name: [ApplicationVersion, 170.2.70.1], value: 2,name: [CurrentCulture, ], value: 3,name: [DefaultEncoding, utf-8], value: 4,name: [DacFxSource, ADO], value: 5,name: [OSVersion, Ubuntu 24.04.3 LTS], value: 6,name: [ProcessArchitecture, X64], value: 7,name: [DotNetPlatform, .NET 9.0.10], value: 8
properties: name: [Action, Publish], value: 0,name: [Options, [{'name':'AllowDropBlockingAssemblies','value':'False'},{'name':'AllowExternalLanguagePaths','value':'False'},{'name':'AllowExternalLibraryPaths','value':'False'},{'name':'AllowIncompatiblePlatform','value':'False'},{'name':'BackupDatabaseBeforeChanges','value':'False'},{'name':'BlockOnPossibleDataLoss','value':'True'},{'name':'BlockWhenDriftDetected','value':'True'},{'name':'CommentOutSetVarDeclarations','value':'False'},{'name':'CompareUsingTargetCollation','value':'False'},{'name':'CreateNewDatabase','value':'False'},{'name':'DeployDatabaseInSingleUserMode','value':'False'},{'name':'IsAlwaysEncryptedParameterizationEnabled','value':'False'},{'name':'DisableAndReenableDdlTriggers','value':'True'},{'name':'DoNotAlterChangeDataCaptureObjects','value':'True'},{'name':'DoNotAlterReplicatedObjects','value':'True'},{'name':'DropConstraintsNotInSource','value':'True'},{'name':'DropDmlTriggersNotInSource','value':'True'},{'name':'IgnoreDatabaseWorkloadGroups','value':'False'},{'name':'IgnoreWorkloadClassifiers','value':'False'},{'name':'DropExtendedPropertiesNotInSource','value':'True'},{'name':'AllowTableRecreation','value':'True'},{'name':'DropIndexesNotInSource','value':'True'},{'name':'DropObjectsNotInSource','value':'False'},{'name':'DropPermissionsNotInSource','value':'False'},{'name':'DropRoleMembersNotInSource','value':'False'},{'name':'DropStatisticsNotInSource','value':'True'},{'name':'DoNotDropDatabaseWorkloadGroups','value':'False'},{'name':'DoNotDropWorkloadClassifiers','value':'False'},{'name':'GenerateSmartDefaults','value':'False'},{'name':'HashObjectNamesInLogs','value':'False'},{'name':'IgnoreAnsiNulls','value':'True'},{'name':'IgnoreAuthorizer','value':'False'},{'name':'IgnoreColumnCollation','value':'False'},{'name':'IgnoreColumnOrder','value':'False'},{'name':'IgnoreComments','value':'False'},{'name':'IgnoreCryptographicProviderFilePath','value':'True'},{'name':'IgnoreDdlTriggerOrder','value':'False'},{'name':'IgnoreDdlTriggerState','value':'False'},{'name':'IgnoreDefaultSchema','value':'False'},{'name':'IgnoreDmlTriggerOrder','value':'False'},{'name':'IgnoreDmlTriggerState','value':'False'},{'name':'IgnoreExtendedProperties','value':'False'},{'name':'IgnoreFileAndLogFilePath','value':'True'},{'name':'IgnoreFilegroupPlacement','value':'True'},{'name':'IgnoreFileSize','value':'True'},{'name':'IgnoreFillFactor','value':'True'},{'name':'IgnoreFullTextCatalogFilePath','value':'True'},{'name':'IgnoreIdentitySeed','value':'False'},{'name':'IgnoreIncrement','value':'False'},{'name':'IgnoreIndexOptions','value':'False'},{'name':'IgnoreIndexPadding','value':'True'},{'name':'IgnoreKeywordCasing','value':'True'},{'name':'IgnoreLockHintsOnIndexes','value':'False'},{'name':'IgnoreLoginSids','value':'True'},{'name':'IgnoreNotForReplication','value':'False'},{'name':'IgnoreObjectPlacementOnPartitionScheme','value':'True'},{'name':'DoNotEvaluateSqlCmdVariables','value':'True'},{'name':'IgnorePreDeployScript','value':'False'},{'name':'IgnorePostDeployScript','value':'False'},{'name':'IgnorePartitionSchemes','value':'False'},{'name':'IgnoreTablePartitionOptions','value':'False'},{'name':'IgnorePermissions','value':'False'},{'name':'IgnoreQuotedIdentifiers','value':'True'},{'name':'IgnoreRoleMembership','value':'False'},{'name':'IgnoreRouteLifetime','value':'True'},{'name':'IgnoreSemicolonBetweenStatements','value':'True'},{'name':'IgnoreSensitivityClassifications','value':'False'},{'name':'IgnoreTableOptions','value':'False'},{'name':'IgnoreUserSettingsObjects','value':'False'},{'name':'IgnoreWhitespace','value':'True'},{'name':'IgnoreWithNocheckOnCheckConstraints','value':'False'},{'name':'IgnoreWithNocheckOnForeignKeys','value':'False'},{'name':'AllowUnsafeRowLevelSecurityDataMovement','value':'False'},{'name':'IncludeCompositeObjects','value':'False'},{'name':'IncludeTransactionalScripts','value':'False'},{'name':'NoAlterStatementsToChangeClrTypes','value':'False'},{'name':'PopulateFilesOnFileGroups','value':'True'},{'name':'PreserveIdentityLastValues','value':'False'},{'name':'PerformIndexOperationsOnline','value':'False'},{'name':'RegisterDataTierApplication','value':'False'},{'name':'RunDeploymentPlanExecutors','value':'False'},{'name':'ScriptDatabaseCollation','value':'False'},{'name':'ScriptDatabaseCompatibility','value':'False'},{'name':'ScriptDatabaseOptions','value':'True'},{'name':'ScriptDeployStateChecks','value':'False'},{'name':'ScriptFileSize','value':'False'},{'name':'ScriptNewConstraintValidation','value':'True'},{'name':'ScriptRefreshModule','value':'True'},{'name':'TreatVerificationErrorsAsWarnings','value':'False'},{'name':'RebuildIndexesOfflineForDataPhase','value':'False'},{'name':'RestoreSequenceCurrentValue','value':'True'},{'name':'DisableIndexesForDataPhase','value':'True'},{'name':'DisableParallelismForEnablingIndexes','value':'False'},{'name':'UnmodifiableObjectWarnings','value':'True'},{'name':'VerifyCollationCompatibility','value':'True'},{'name':'VerifyDeployment','value':'True'},{'name':'CommandTimeout','value':'60'},{'name':'LongRunningCommandTimeout','value':'0'},{'name':'DatabaseLockTimeout','value':'60'}]], value: 1,name: [IncludesSQLCMDVariables, False], value: 2,name: [DataStorageType, ], value: 3,name: [IncludesContributors, False], value: 4,name: [PackageVersion, 3.1.0.0], value: 5,name: [ApplicationProperty, DotnetTool], value: 6,name: [ModelSchemaVersion, 3.5], value: 7,name: [DataStreamVersion, 2.0.0.0], value: 8,name: [DeploymentContributorsStreamVersion, 1.0.0.0], value: 9,name: [HasDataPath, False], value: 10,name: [TargetDatabaseExists, False], value: 11,name: [SourcePlatform, Sql140], value: 12,name: [ObjectCounts, [{'type':'SubroutineParameter','count':1093},{'type':'Sequence','count':3},{'type':'Table','count':332},{'type':'View','count':147},{'type':'Procedure','count':270},{'type':'ScalarFunction','count':131},{'type':'InlineTableValuedFunction','count':109},{'type':'ScriptFunctionImplementation','count':240},{'type':'Index','count':239},{'type':'PrimaryKeyConstraint','count':160},{'type':'ForeignKeyConstraint','count':413},{'type':'DefaultConstraint','count':240},{'type':'CheckConstraint','count':1},{'type':'ComputedColumn','count':3379},{'type':'SimpleColumn','count':3725},{'type':'DatabaseOptions','count':1},{'type':'TableType','count':8},{'type':'Schema','count':7},{'type':'Queue','count':2},{'type':'Service','count':2},{'type':'Contract','count':2},{'type':'MessageType','count':3},{'type':'TableTypeSimpleColumn','count':20},{'type':'TableTypePrimaryKeyConstraint','count':2},{'type':'TableTypeIndexedColumnSpecification','count':2}]], value: 13,name: [AuthenticationMethod, NotSpecified], value: 14,name: [AuthenticationUniversal, False], value: 15,name: [ServerEngineEdition, 3], value: 16,name: [ServerEdition, Enterprise Evaluation Edition (64-bit)], value: 17,name: [ServerLevel, RC1], value: 18,name: [ServerVersion, 17.0.925.4], value: 19,name: [ServiceObjective, ], value: 20,name: [ServerPlatform, NT x64], value: 21,name: [ServerWindowsVersion, 6.3 (20348)], value: 22,name: [ServerProcessorCount, 2], value: 23,name: [ServerPhysicalMemoryInMB, 12793], value: 24,name: [ServerMaxMemoryInMB, 2147483647], value: 25,name: [ServerOS, SQL Server Windows NT - 64 Bit], value: 26,name: [DatabaseRecoveryModel, SIMPLE], value: 27,name: [DatabaseMAXDOP, 0], value: 28,name: [AzureDatabaseMaxStorageSizeInGB, 0], value: 29,name: [TargetPlatform, Sql170], value: 30,name: [OperationResult, Failed], value: 31,name: [DacErrors, 72014,72045,72014,72045], value: 32,name: [DacErrorSummary, [{code:72014,severity:'Error'},{code:72045,severity:'Error'},{code:72014,severity:'Error'},{code:72045,severity:'Error'}]], value: 33,name: [ConnectionRetries, ], value: 34
measurements: name: [ReverseEngineerDurationMs, 476], value: 0,name: [LoadDeploymentComponentsDurationMs, 993], value: 1,name: [DatabaseSize, 0], value: 2,name: [TableRowCount, 0], value: 3,name: [CompareModelDurationMs, 334], value: 4,name: [TotalObjects, 10531], value: 5,name: [BuildDeploymentPlanDurationMs, 939], value: 6,name: [CreatingDeploymentPlanDurationMs, 9031], value: 7,name: [VerifyingDeploymentPlanDurationMs, 290], value: 8,name: [UpdateDatabaseDurationMs, 361], value: 9,name: [ExecuteDeploymentPlanDurationMs, 367], value: 10,name: [MemoryUsageMB, 315], value: 11,name: [DurationMs, 9731], value: 12
common measurements:
*** Could not deploy package.
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 5123, Level 16, State 1, Line 1 CREATE FILE encountered operating system error 5(Access is denied.) while attempting to open or create the physical file '/FooDatabase_Primary.mdf'.
Error SQL72045: Script execution error. The executed script:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 1802, Level 16, State 4, Line 1 CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
Error SQL72045: Script execution error. The executed script:
CREATE DATABASE [$(DatabaseName)]
ON
PRIMARY(NAME = [$(DatabaseName)], FILENAME = N'$(DefaultDataPath)$(DefaultFilePrefix)_Primary.mdf')
LOG ON (NAME = [$(DatabaseName)_log], FILENAME = N'$(DefaultLogPath)$(DefaultFilePrefix)_Primary.ldf') COLLATE SQL_Latin1_General_CP1_CI_AS;
Microsoft.Data.Tools.Diagnostics.Tracer Information: 18 : 2025-10-27T16:03:26 : Time elapsed: 0:00:10.04.
Time elapsed 0:00:10.04
Microsoft.Data.Tools.Diagnostics.Tracer Information: 0 : 2025-10-27T16:03:26 : SqlPackage failed
##[error]Bash exited with code '1'.
```
4. Try to publish the same dacpac with the same sqlpackage version and parameters on a windows machine, the Publish action goes through successfully, and the database and log files are created in the correct folders.
**Did this occur in prior versions? If not - which version(s) did it work in?** I've tried with both the latest version and 161.8089.0 (which supposedly fixed a very similar issue: https://github.com/microsoft/DacFx/issues/136), neither version was able to publish successfully.
(DacFx/**SqlPackage**/SSMS/Azure Data Studio)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the issue with SqlPackage publishing from Ubuntu to SQL Server on Linux, using the reported DefaultDataPath and DefaultLogPath settings and verbose diagnostics. Inspect the generated deployment script around the :setvar declarations and database creation step. Done means the configured /sql_data and /sql_log paths are loaded instead of root when publishing the DACPAC.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- linux, sql
- Domain
- cli, databases, operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100