VERIFIED
3yourmind__django-migration-linter-258
VERIFIED on first verdict
1 attempt, 0 appeals. 1 file, 3 added and 1 removed lines. Tokens: 132,514 tokens. Model cost: $0.009. Sandbox time: 1 min 13 s.
The plan
- Repository
- 3yourmind/django-migration-linter
- Base commit
- 366d16b (image tag)
- Issue
- Adding an index with a NOT NULL condition incorrectly triggers NOT_NULL rule Adding an index with a `WHERE` clause including `NOT NULL` gets flagged as a `NOT NULL constraint on columns` error. ## Steps to reproduce The follow migration operation: ```python
- Files to edit
django_migration_linter/sql_analyser/base.py
- Approach
- Modify the condition that detects NOT NULL to also permit CREATE INDEX statements, matching the suggestion in the issue.
Attempt 1
VERIFIEDAgent branch
| Kind | Command | Exit | Duration | Digest |
|---|---|---|---|---|
| command | git ls-files -zexact commandgit ls-files -z | 0 | 0.004s | 50bd938d |
| write | write django_migration_linter/sql_analyser/base.pyexact command/opt/receipts-bef3d62daa014f5e96f174f837f8a101/bin/busybox sh -c 'mkdir -p /django-migration-linter/django_migration_linter/sql_analyser && cp /opt/receipts-bef3d62daa014f5e96f174f837f8a101/incoming/efe7a39f87fef06b9c16de4eb8b8aa6f252983b3be67159ea1a4118ffe86a24b /django-migration-linter/django_migration_linter/sql_analyser/base.py' | 0 | 0.005s | 2b7582b3 |
| command | pytest tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_create_index_concurrently_where -vexact command/opt/receipts-de5353af5ad54a6c9f7dd3f614e67689/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-de5353af5ad54a6c9f7dd3f614e67689/receipts_pytest.py tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_create_index_concurrently_where -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-3.xml | 0 | 0.827s | 776d83735fea |
| command | pytest tests/unit/test_sql_analyser.py -vexact command/opt/receipts-742d376f571b4d0fa59f456f425451ba/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-742d376f571b4d0fa59f456f425451ba/receipts_pytest.py tests/unit/test_sql_analyser.py -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-4.xml | 0 | 0.862s | 776d83735fea |
| command | cd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
sql = '''CREATE INDEX CONCURRENTLY \"delete_data_after_idx\" ON \"models_prediction\" (\"delete_data_after\") WHERE (\"data_deleted_at\" IS NULL AND \"delete_data_after\" IS NOT NULL);'''
result = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql]
)
errors = [e for e in result if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'NOT_NULL errors: {len(errors)}')
for e in errors:
print(f' - {e.message}')
warnings = [e for e in result if hasattr(e, 'code') and e.code == 'ADD_UNIQUE']
print(f'ADD_UNIQUE warnings: {len(warnings)}')
print('SUCCESS: No NOT_NULL error detected for CREATE INDEX with WHERE IS NOT NULL' if len(errors) == 0 else 'FAILURE')
"exact commandcd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
sql = '''CREATE INDEX CONCURRENTLY \"delete_data_after_idx\" ON \"models_prediction\" (\"delete_data_after\") WHERE (\"data_deleted_at\" IS NULL AND \"delete_data_after\" IS NOT NULL);'''
result = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql]
)
errors = [e for e in result if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'NOT_NULL errors: {len(errors)}')
for e in errors:
print(f' - {e.message}')
warnings = [e for e in result if hasattr(e, 'code') and e.code == 'ADD_UNIQUE']
print(f'ADD_UNIQUE warnings: {len(warnings)}')
print('SUCCESS: No NOT_NULL error detected for CREATE INDEX with WHERE IS NOT NULL' if len(errors) == 0 else 'FAILURE')
" | 0 | 0.156s | e7ca6df5 |
| command | cd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
# Test 1: Actual ALTER TABLE SET NOT NULL should still be detected
sql1 = '''ALTER TABLE \"app_test\" ALTER COLUMN \"field\" SET NOT NULL;'''
result1 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql1]
)
errors1 = [e for e in result1 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 1 - ALTER TABLE SET NOT NULL: {len(errors1)} error(s) (expected 1)')
for e in errors1:
print(f' - {e.message}')
# Test 2: CREATE TABLE with NOT NULL should still be allowed (excluded by design)
sql2 = 'CREATE TABLE \"app_test\" (\"id\" integer NOT NULL);'
result2 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql2]
)
errors2 = [e for e in result2 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 2 - CREATE TABLE NOT NULL: {len(errors2)} error(s) (expected 0 - CREATE TABLE is excluded)')
# Test 3: Regular CREATE INDEX without WHERE should be allowed
sql3 = 'CREATE INDEX \"idx_name\" ON \"table\" (\"col\");'
result3 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql3]
)
errors3 = [e for e in result3 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 3 - CREATE INDEX (no WHERE): {len(errors3)} error(s) (expected 0)')
# Test 4: CREATE UNIQUE INDEX should still be detected as ADD_UNIQUE
sql4 = 'CREATE UNIQUE INDEX \"idx_name\" ON \"table\" (\"col\");'
result4 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql4]
)
errors4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'ADD_UNIQUE']
warnings4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'WARNING']
print(f'Test 4 - CREATE UNIQUE INDEX: {len(errors4)} error(s), {len(warnings4)} warning(s) (expected 1 ADD_UNIQUE)')
"exact commandcd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
# Test 1: Actual ALTER TABLE SET NOT NULL should still be detected
sql1 = '''ALTER TABLE \"app_test\" ALTER COLUMN \"field\" SET NOT NULL;'''
result1 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql1]
)
errors1 = [e for e in result1 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 1 - ALTER TABLE SET NOT NULL: {len(errors1)} error(s) (expected 1)')
for e in errors1:
print(f' - {e.message}')
# Test 2: CREATE TABLE with NOT NULL should still be allowed (excluded by design)
sql2 = 'CREATE TABLE \"app_test\" (\"id\" integer NOT NULL);'
result2 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql2]
)
errors2 = [e for e in result2 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 2 - CREATE TABLE NOT NULL: {len(errors2)} error(s) (expected 0 - CREATE TABLE is excluded)')
# Test 3: Regular CREATE INDEX without WHERE should be allowed
sql3 = 'CREATE INDEX \"idx_name\" ON \"table\" (\"col\");'
result3 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql3]
)
errors3 = [e for e in result3 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 3 - CREATE INDEX (no WHERE): {len(errors3)} error(s) (expected 0)')
# Test 4: CREATE UNIQUE INDEX should still be detected as ADD_UNIQUE
sql4 = 'CREATE UNIQUE INDEX \"idx_name\" ON \"table\" (\"col\");'
result4 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql4]
)
errors4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'ADD_UNIQUE']
warnings4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'WARNING']
print(f'Test 4 - CREATE UNIQUE INDEX: {len(errors4)} error(s), {len(warnings4)} warning(s) (expected 1 ADD_UNIQUE)')
" | 0 | 0.142s | 3066fd3d |
| command | cd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
# Test 1: Actual ALTER TABLE SET NOT NULL should still be detected
sql1 = 'ALTER TABLE \"app_test\" ALTER COLUMN \"field\" SET NOT NULL;'
result1 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql1]
)
errors1 = [e for e in result1 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 1 - ALTER TABLE SET NOT NULL: {len(errors1)} error(s) (expected 1)')
for e in errors1:
print(f' - {e.message}')
# Test 2: CREATE TABLE with NOT NULL should still be allowed (excluded by design)
sql2 = 'CREATE TABLE \"app_test\" (\"id\" integer NOT NULL);'
result2 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql2]
)
errors2 = [e for e in result2 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 2 - CREATE TABLE NOT NULL: {len(errors2)} error(s) (expected 0 - CREATE TABLE is excluded)')
# Test 3: Regular CREATE INDEX without WHERE should be allowed
sql3 = 'CREATE INDEX \"idx_name\" ON \"table\" (\"col\");'
result3 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql3]
)
errors3 = [e for e in result3 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 3 - CREATE INDEX (no WHERE): {len(errors3)} error(s) (expected 0)')
# Test 4: CREATE UNIQUE INDEX should still be detected as ADD_UNIQUE
sql4 = 'CREATE UNIQUE INDEX \"idx_name\" ON \"table\" (\"col\");'
result4 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql4]
)
errors4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'ADD_UNIQUE']
warnings4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'WARNING']
print(f'Test 4 - CREATE UNIQUE INDEX: {len(errors4)} error(s), {len(warnings4)} warning(s) (expected 1 ADD_UNIQUE)')
"exact commandcd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
# Test 1: Actual ALTER TABLE SET NOT NULL should still be detected
sql1 = 'ALTER TABLE \"app_test\" ALTER COLUMN \"field\" SET NOT NULL;'
result1 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql1]
)
errors1 = [e for e in result1 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 1 - ALTER TABLE SET NOT NULL: {len(errors1)} error(s) (expected 1)')
for e in errors1:
print(f' - {e.message}')
# Test 2: CREATE TABLE with NOT NULL should still be allowed (excluded by design)
sql2 = 'CREATE TABLE \"app_test\" (\"id\" integer NOT NULL);'
result2 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql2]
)
errors2 = [e for e in result2 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 2 - CREATE TABLE NOT NULL: {len(errors2)} error(s) (expected 0 - CREATE TABLE is excluded)')
# Test 3: Regular CREATE INDEX without WHERE should be allowed
sql3 = 'CREATE INDEX \"idx_name\" ON \"table\" (\"col\");'
result3 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql3]
)
errors3 = [e for e in result3 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test 3 - CREATE INDEX (no WHERE): {len(errors3)} error(s) (expected 0)')
# Test 4: CREATE UNIQUE INDEX should still be detected as ADD_UNIQUE
sql4 = 'CREATE UNIQUE INDEX \"idx_name\" ON \"table\" (\"col\");'
result4 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=[sql4]
)
errors4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'ADD_UNIQUE']
warnings4 = [e for e in result4 if hasattr(e, 'code') and e.code == 'WARNING']
print(f'Test 4 - CREATE UNIQUE INDEX: {len(errors4)} error(s), {len(warnings4)} warning(s) (expected 1 ADD_UNIQUE)')
" | 0 | 0.142s | c434447b |
| command | cd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
# Test: ALTER TABLE SET NOT NULL with multiple statements
sql1 = [
'ALTER TABLE \"app_test\" ADD COLUMN \"field\" integer NOT NULL;',
'ALTER TABLE \"app_test\" ALTER COLUMN \"field\" DROP DEFAULT;',
]
result1 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=sql1
)
errors1 = [e for e in result1 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test - ALTER TABLE ADD NOT NULL + DROP DEFAULT: {len(errors1)} error(s) (expected 1)')
for e in errors1:
print(f' - {e.message}')
"exact commandcd /django-migration-linter && python -c "
from django_migration_linter.sql_analyser import analyse_sql_statements, get_sql_analyser_class
# Test: ALTER TABLE SET NOT NULL with multiple statements
sql1 = [
'ALTER TABLE \"app_test\" ADD COLUMN \"field\" integer NOT NULL;',
'ALTER TABLE \"app_test\" ALTER COLUMN \"field\" DROP DEFAULT;',
]
result1 = analyse_sql_statements(
get_sql_analyser_class('postgresql'),
sql_statements=sql1
)
errors1 = [e for e in result1 if hasattr(e, 'code') and e.code == 'NOT_NULL']
print(f'Test - ALTER TABLE ADD NOT NULL + DROP DEFAULT: {len(errors1)} error(s) (expected 1)')
for e in errors1:
print(f' - {e.message}')
" | 0 | 0.143s | 812e3c4f |
| command | pytest tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_make_column_not_null_with_django_default -vexact command/opt/receipts-90c3c0cf485a40cfb0bc369d6b84f3a4/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-90c3c0cf485a40cfb0bc369d6b84f3a4/receipts_pytest.py tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_make_column_not_null_with_django_default -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-9.xml | 0 | 0.827s | 776d83735fea |
| command | pytest tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_field_to_not_null_with_dropped_default -vexact command/opt/receipts-b9546630319a42b5ab4ce77de60dc8df/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-b9546630319a42b5ab4ce77de60dc8df/receipts_pytest.py tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_field_to_not_null_with_dropped_default -v -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/agent1-10.xml | 0 | 0.822s | 776d83735fea |
| diff | capture patchexact commandcompute patch in executor staging agent1-a78bfd26727c4b5f940fd28ec8702d38: /opt/homebrew/Cellar/git/2.53.0/bin/git -c core.hooksPath=/dev/null -c core.attributesFile=/dev/null -c diff.external= -c core.quotePath=false add -A && /opt/homebrew/Cellar/git/2.53.0/bin/git -c core.hooksPath=/dev/null -c core.attributesFile=/dev/null -c diff.external= -c core.quotePath=false diff --cached --binary --no-ext-diff --no-textconv --no-renames ecfc6258093ea8b744ac8bc7d3201713287bebc3 | 0 | 0.035s | 776d83735fea |
- Finish summary
- Fixed the NOT_NULL rule false positive for CREATE INDEX with WHERE clause containing IS NOT NULL. The fix added `and not sql.startswith("CREATE INDEX")` to the condition in `has_not_null_column()` function in `django_migration_linter/sql_analyser/base.py` line 46. This excludes CREATE INDEX statements from the NOT_NULL detection, while still correctly detecting actual NOT NULL constraints on columns via ALTER TABLE statements. All 37 tests in test_sql_analyser.py pass, including the specific test `test_create_index_concurrently_where` that was failing before the fix.
- Worker outcome
- finished
- Target tests pass: yes
- Full suite passes: yes
- Files changed: django_migration_linter/sql_analyser/base.py
- Ran tests: yes
Witness branch w1
| Kind | Command | Exit | Duration | Digest |
|---|---|---|---|---|
| apply | apply patch 08e0c7b8afceexact commandgit update-index -q --refresh; git apply -v --3way --recount --ignore-space-change --whitespace=nowarn /opt/receipts-631a3952f6e24a5586f189d64f8a2a90/incoming/08e0c7b8afce695f8eb836f863f01b55bd423b0eb37f03a13ef46a708ec47262.diff | 0 | 0.008s | 776d83735fea |
| verification | pytest (witness) tests/unit/test_sql_analyser.pyexact command/opt/receipts-01b26643c91d45299064b29cd3304dfd/bin/busybox mkdir -p /opt/receipts/reports && python -I /opt/receipts-01b26643c91d45299064b29cd3304dfd/receipts_pytest.py --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning tests/unit/test_sql_analyser.py -o junit_family=xunit1 -p no:cacheprovider -rA --continue-on-collection-errors --junitxml=/opt/receipts/reports/w1-2.xml | 0 | 0.869s | 776d83735fea |
Gate predicate checklist
| Predicate | Name | Status | Evidence |
|---|---|---|---|
R1_fail_to_pass | Failing specification tests now pass | PASS | target tests passed: tests/unit/test_sql_analyser.py::PostgresqlAnalyserTestCase::test_create_index_concurrently_where |
R2_pass_to_pass | Previously passing tests kept | PASS | 36 baseline-passing tests still pass |
R3_no_shrink | No removed tests or new skips | PASS | all 37 baseline tests collected; skips unchanged (0) |
R4_patch_scope | Patch scope | PASS | patch touches 1 file(s), all in scope |
R5_provenance | Witness chain and patch digest | PASS | agent chain 2e8d50ac -> ef7d98a4 unbroken over 11 receipt(s); witness chain 2e8d50ac -> 017d223d unbroken over 2 receipt(s); applied digest matches |
R6_claim_audit | Agent claim audit (advisory) | FAIL | claimed full suite green; own last run collected 1 of 37 |
What it said
- Finish summary
- Fixed the NOT_NULL rule false positive for CREATE INDEX with WHERE clause containing IS NOT NULL. The fix added `and not sql.startswith("CREATE INDEX")` to the condition in `has_not_null_column()` function in `django_migration_linter/sql_analyser/base.py` line 46. This excludes CREATE INDEX statements from the NOT_NULL detection, while still correctly detecting actual NOT NULL constraints on columns via ALTER TABLE statements. All 37 tests in test_sql_analyser.py pass, including the specific test `test_create_index_concurrently_where` that was failing before the fix.
- Worker outcome
- finished
- Target tests pass: yes
- Full suite passes: yes
- Files changed: django_migration_linter/sql_analyser/base.py
- Ran tests: yes
What the record shows
contradicted: claimed full suite green; own last run collected 1 of 37
SWE-rebench's official grader: resolved
Agrees with the gate
Shipped patch
diff --git a/django_migration_linter/sql_analyser/base.py b/django_migration_linter/sql_analyser/base.pyindex 2fa0646..f067860 100644--- a/django_migration_linter/sql_analyser/base.py+++ b/django_migration_linter/sql_analyser/base.py@@ -40,7 +40,9 @@ def has_not_null_column(sql_statements: list[str], **kwargs) -> bool: ends_with_default = False return ( any(- re.search("(?<!DROP )NOT NULL", sql) and not sql.startswith("CREATE TABLE")+ re.search("(?<!DROP )NOT NULL", sql)+ and not sql.startswith("CREATE TABLE")+ and not sql.startswith("CREATE INDEX") for sql in sql_statements ) and ends_with_default is False
Model and costs
- Model
- nvidia/Nemotron-3_5-Lightning thinking off · temperature 1.0 · top_p 0.95
- Tokens
- 132,514 tokens
- Model cost
- $0.009
- Sandbox time
- 1 min 13 s
- Sandbox cost
- Token Factory reported cost: 0.076 (unit not published)
Full environment disclosure
{
"executor_kind": "tokenfactory",
"lock_sha256": "3e7c0bcec8ad7411e0e772aa96850a1a7ee11e3d9d08b9532367fadfec82bf5b",
"model": {
"base_url": "https://api.tokenfactory.nebius.com/v1/",
"client": "TokenFactoryClient",
"max_tokens": null,
"model": "nvidia/Nemotron-3_5-Lightning",
"temperature": 1.0,
"thinking": false,
"top_p": 0.95
},
"pytest_config_digests": {
"setup.cfg": "d11f8ab4c8277d78931a76a95dbe4275652accfa25d06c13f9ffd336ae646e20",
"tox.ini": "8a658aef9fbc6de9c20cef305d856b2e172c8b3b21eb86e83565957c164f334f"
},
"receipts_version": "0.0.1",
"test_digests": {
"tests/unit/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"tests/unit/test_linter.py": "57a34246fae6fc20a85d910b1cfd725bda84778a10bb2e15a049f7f009e0f5b1",
"tests/unit/test_sql_analyser.py": "cd135e2a5aaeef65cc18e811212e6b3924d051ca83e515fdd6d2979ed353fd70",
"tests/unit/test_utils.py": "606f005e46d08bd8ac2e3b4dd760039db54774f1c56a8f76ab3e603b22ceaabf"
}
}The bundle
Recorded JSON and patches. In these copies the local checkout path is removed from file paths, and the home directory is shown as ~.
- attempts/1/filtered.diff
- attempts/1/patch.diff
- attempts/1/verdict.json
- attempts/1/witness/receipts.jsonl
- baseline.json
- branches/agent1/receipts.jsonl
- branches/base/receipts.jsonl
- branches/official1/receipts.jsonl
- branches/w1/receipts.jsonl
- cost.json
- disclosure.json
- input.json
- lock.txt
- plan.json
- record.json
- result.json