@mudraforge/statutory 2.7.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +60 -27
  3. package/bin/cli.js +359 -16
  4. package/docs/CORPUS_QUALITY.md +19 -6
  5. package/docs/PROVENANCE.md +33 -0
  6. package/okf/corporate_ma_restructuring/slump_sale_50b/circulars/cbdt_notification_68_2021_rule_11uae_fmv.md +1 -1
  7. package/okf/corporate_ma_restructuring/slump_sale_50b/circulars/cbic_notification_12_2017_going_concern_exemption.md +1 -1
  8. package/okf/corporate_ma_restructuring/slump_sale_50b/section.json +2 -2
  9. package/okf/direct_tax/special_rates_non_filer_206ab/circulars/cbdt_circular_11_2021_compliance_check.md +1 -1
  10. package/okf/direct_tax/special_rates_non_filer_206ab/section.json +1 -1
  11. package/okf/direct_tax/tcs_goods_206c_1h/circulars/finance_act_2025_sunset_memo.md +1 -1
  12. package/okf/direct_tax/tcs_goods_206c_1h/section.json +3 -3
  13. package/okf/direct_tax/tds_commission_194h/circulars/finance_act_2024_rate_cut_memo.md +1 -1
  14. package/okf/direct_tax/tds_commission_194h/section.json +6 -6
  15. package/okf/direct_tax/tds_contractor_194c/circulars/cbdt_circular_23_2017_gst_unbundling.md +1 -1
  16. package/okf/direct_tax/tds_contractor_194c/section.json +6 -6
  17. package/okf/direct_tax/tds_goods_194q/circulars/cbdt_circular_13_2021_guidelines.md +1 -1
  18. package/okf/direct_tax/tds_goods_194q/circulars/cbdt_circular_23_2017_gst_unbundling.md +1 -1
  19. package/okf/direct_tax/tds_goods_194q/section.json +3 -3
  20. package/okf/direct_tax/tds_goods_393/section.json +3 -3
  21. package/okf/direct_tax/tds_perquisites_194r/circulars/cbdt_circular_12_2022_perquisites.md +1 -1
  22. package/okf/direct_tax/tds_perquisites_194r/section.json +4 -4
  23. package/okf/direct_tax/tds_rent_194i/circulars/cbdt_circular_23_2017_gst_unbundling.md +1 -1
  24. package/okf/direct_tax/tds_rent_194i/section.json +6 -6
  25. package/okf/direct_tax/tds_services_194j/circulars/cbdt_circular_03_2020_fts_rate_cut.md +1 -1
  26. package/okf/direct_tax/tds_services_194j/section.json +3 -3
  27. package/okf/indirect_tax_gst/blocked_itc_17_5/circulars/cbic_circular_172_2022_employer_obligations.md +1 -1
  28. package/okf/indirect_tax_gst/blocked_itc_17_5/section.json +4 -4
  29. package/okf/indirect_tax_gst/composite_mixed_supplies_sec8/circulars/cbic_circular_47_2018_composite_mixed_supplies.md +1 -1
  30. package/okf/indirect_tax_gst/composite_mixed_supplies_sec8/section.json +3 -3
  31. package/okf/indirect_tax_gst/composition_levy_sec10/circulars/cbic_notification_14_2019_composition.md +1 -1
  32. package/okf/indirect_tax_gst/composition_levy_sec10/section.json +2 -2
  33. package/okf/indirect_tax_gst/credit_debit_notes_sec34/circulars/cbic_circular_137_2020_credit_notes.md +1 -1
  34. package/okf/indirect_tax_gst/credit_debit_notes_sec34/section.json +2 -2
  35. package/okf/indirect_tax_gst/e_invoicing_rule48_4/circulars/cbic_notification_10_2023_einvoicing.md +1 -1
  36. package/okf/indirect_tax_gst/e_invoicing_rule48_4/section.json +2 -2
  37. package/okf/indirect_tax_gst/gst_tds_sec51/circulars/cbic_notification_50_2018_gst_tds.md +1 -1
  38. package/okf/indirect_tax_gst/gst_tds_sec51/section.json +6 -6
  39. package/okf/indirect_tax_gst/itc_eligibility_16_2/circulars/cbic_circular_170_2022_itc_reporting.md +1 -1
  40. package/okf/indirect_tax_gst/itc_eligibility_16_2/section.json +4 -4
  41. package/okf/indirect_tax_gst/rcm_liability_sec9_3/circulars/cbic_circular_102_2019_rcm_clarifications.md +1 -1
  42. package/okf/indirect_tax_gst/rcm_liability_sec9_3/section.json +3 -3
  43. package/okf/international_tax/cross_border_remittance_195/circulars/cbdt_circular_03_2022_form10f_electronic.md +1 -1
  44. package/okf/international_tax/cross_border_remittance_195/circulars/supreme_court_engineering_analysis_doctrine.md +1 -1
  45. package/okf/international_tax/cross_border_remittance_195/section.json +3 -3
  46. package/okf/manifest.json +51 -51
  47. package/okf/msme_commercial/delayed_payments_15_16/circulars/msme_om_2021_trader_exclusion.md +1 -1
  48. package/okf/msme_commercial/delayed_payments_15_16/forms/schedule_iii_msme_disclosure.md +1 -1
  49. package/okf/msme_commercial/delayed_payments_15_16/section.json +5 -5
  50. package/okf/msme_commercial/enterprise_classification_sec7/circulars/msme_notification_2119_e_composite_criteria.md +1 -1
  51. package/okf/msme_commercial/enterprise_classification_sec7/section.json +2 -2
  52. package/okf/msme_commercial/mca_msme_1_filing/circulars/mca_order_2019_specified_companies.md +1 -1
  53. package/okf/msme_commercial/mca_msme_1_filing/section.json +2 -2
  54. package/okf/msme_commercial/statutory_disclosures_sec22/circulars/icai_guidance_note_schedule_iii_trade_payables.md +1 -1
  55. package/okf/msme_commercial/statutory_disclosures_sec22/section.json +3 -3
  56. package/okf.publication.json +1 -1
  57. package/package.json +3 -2
  58. package/src/index.js +1162 -2
  59. package/types/index.d.ts +104 -0
package/bin/cli.js CHANGED
@@ -18,6 +18,11 @@ import {
18
18
  getLocalManifest,
19
19
  checkForPackageUpdate,
20
20
  decodeTaxIdentifier,
21
+ verifyLocalSubstrate,
22
+ runStatutoryDoctor,
23
+ crosswalkStatute,
24
+ getStatutoryDiff,
25
+ STATUTORY_EXIT_CODES,
21
26
  STATUTORY_CLIENT_VERSION,
22
27
  DEFAULT_LOCAL_OKF_DIR
23
28
  } from '../src/index.js';
@@ -25,11 +30,65 @@ import {
25
30
  const __filename = fileURLToPath(import.meta.url);
26
31
  const __dirname = path.dirname(__filename);
27
32
 
28
- const args = process.argv.slice(2);
33
+ const rawArgs = process.argv.slice(2);
34
+ const isJsonMode = rawArgs.includes('--json') || rawArgs.includes('-j');
35
+ const isOfflineMode = rawArgs.includes('--offline') || rawArgs.includes('-o');
36
+ const args = rawArgs.filter(a => a !== '--json' && a !== '-j' && a !== '--offline' && a !== '-o');
29
37
  const command = args[0] ? args[0].toLowerCase() : 'help';
30
38
 
39
+ function getNamedArg(nameList, argList) {
40
+ for (let i = 0; i < argList.length; i++) {
41
+ const item = argList[i];
42
+ for (const name of nameList) {
43
+ if (item === name && i + 1 < argList.length && !argList[i + 1].startsWith('-')) {
44
+ return argList[i + 1];
45
+ }
46
+ if (item.startsWith(`${name}=`)) {
47
+ return item.slice(name.length + 1);
48
+ }
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+
31
54
  async function main() {
32
55
  switch (command) {
56
+ case 'doctor':
57
+ case 'diagnose':
58
+ await handleDoctor();
59
+ break;
60
+
61
+ case 'verify':
62
+ case 'audit':
63
+ case 'check':
64
+ await handleVerify(args[1]);
65
+ break;
66
+
67
+ case 'crosswalk':
68
+ case 'bridge':
69
+ case 'transition': {
70
+ const section = (args[1] && !args[1].startsWith('-')) ? args[1] : getNamedArg(['--section', '-s'], rawArgs);
71
+ const creditDate = getNamedArg(['--credit', '-c'], rawArgs);
72
+ const paymentDate = getNamedArg(['--payment', '-p'], rawArgs);
73
+ const asOfDate = getNamedArg(['--date', '-d', '--as-of'], rawArgs);
74
+ if (!section) {
75
+ console.error('[ERROR] Please specify a section to crosswalk, e.g. npx @mudraforge/statutory crosswalk 194Q --credit 2026-03-25 --payment 2026-04-10');
76
+ process.exit(STATUTORY_EXIT_CODES.USAGE_ERROR);
77
+ }
78
+ await handleCrosswalk(section, { creditDate, paymentDate, asOfDate });
79
+ break;
80
+ }
81
+
82
+ case 'diff':
83
+ case 'changelog':
84
+ case 'amendments': {
85
+ const section = (args[1] && !args[1].startsWith('-')) ? args[1] : getNamedArg(['--section', '-s'], rawArgs);
86
+ const since = getNamedArg(['--since'], rawArgs);
87
+ const domain = getNamedArg(['--domain'], rawArgs);
88
+ await handleDiff({ section, since, domain });
89
+ break;
90
+ }
91
+
33
92
  case 'init-skill':
34
93
  case 'install-skill':
35
94
  await handleInitSkill(args[1]);
@@ -90,7 +149,7 @@ async function main() {
90
149
  }
91
150
 
92
151
  // Non-intrusive background npm package update notice
93
- if (!['check-update', 'status', 'version'].includes(command)) {
152
+ if (!isJsonMode && !['check-update', 'status', 'version', 'verify', 'audit', 'check', 'crosswalk', 'bridge', 'transition', 'diff', 'changelog', 'amendments'].includes(command)) {
94
153
  try {
95
154
  const updateInfo = await checkForPackageUpdate();
96
155
  if (updateInfo && updateInfo.updateAvailable) {
@@ -103,23 +162,244 @@ async function main() {
103
162
  }
104
163
  }
105
164
 
165
+ async function handleVerify(targetDir) {
166
+ try {
167
+ let dest = DEFAULT_LOCAL_OKF_DIR;
168
+ if (targetDir) {
169
+ dest = path.resolve(process.cwd(), targetDir);
170
+ }
171
+ const report = verifyLocalSubstrate(dest);
172
+ if (isJsonMode) {
173
+ console.log(JSON.stringify(report, null, 2));
174
+ process.exit(report.exitCode);
175
+ }
176
+
177
+ console.log('\n===========================================================================');
178
+ console.log(`MUDRAFORGE OPEN KNOWLEDGE FORMAT (OKF) — CRYPTOGRAPHIC VERIFIER [v${report.okfVersion || 'Unknown'}]`);
179
+ console.log('===========================================================================');
180
+
181
+ if (report.integrity.valid) {
182
+ console.log(`[OK] Integrity: ${report.integrity.totalFilesChecked} files verified against Merkle manifest.`);
183
+ console.log(` Root Merkle Hash: ${report.integrity.computedRoot}`);
184
+ } else {
185
+ console.error(`[FAIL] Integrity: Mismatches: ${report.integrity.mismatches.length}, Missing: ${report.integrity.missingFiles.length}, Untracked: ${report.integrity.untrackedFiles.length}`);
186
+ for (const m of report.integrity.mismatches) {
187
+ console.error(` • ${m.file} (Expected ${m.expected.slice(0, 10)}..., actual ${m.actual.slice(0, 10)}...)`);
188
+ }
189
+ for (const mf of report.integrity.missingFiles) {
190
+ console.error(` • Missing: ${mf}`);
191
+ }
192
+ }
193
+
194
+ if (report.authenticity.valid) {
195
+ console.log(`[OK] Authenticity: Provenance authenticated via ${report.authenticity.method}.`);
196
+ if (report.authenticity.keyId) {
197
+ console.log(` Signer Key ID: ${report.authenticity.keyId}`);
198
+ }
199
+ } else {
200
+ console.error(`[FAIL] Authenticity: Root hash "${report.integrity.computedRoot}" is neither pinned nor signed by an authorized MudraForge trust anchor.`);
201
+ }
202
+
203
+ if (report.baselineCheck.valid) {
204
+ console.log(`[OK] Statutory Policy: All mandatory baseline provisions present (${report.baselineCheck.baselineSections.join(', ')}).`);
205
+ } else {
206
+ console.error(`[FAIL] Statutory Policy: Missing mandatory baseline provisions: ${report.baselineCheck.missingBaseline.join(', ')}`);
207
+ }
208
+
209
+ console.log('───────────────────────────────────────────────────────────────────────────');
210
+ if (report.valid) {
211
+ console.log(`[PASS] Statutory substrate is authentic, intact, and compliant (Exit ${report.exitCode}).\n`);
212
+ } else {
213
+ console.error(`[FAIL] Verification failed with Exit Code ${report.exitCode}.\n`);
214
+ }
215
+ process.exit(report.exitCode);
216
+ } catch (err) {
217
+ if (isJsonMode) {
218
+ console.log(JSON.stringify({ valid: false, exitCode: STATUTORY_EXIT_CODES.USAGE_ERROR, error: err.message }, null, 2));
219
+ } else {
220
+ console.error(`[ERROR] Verification error: ${err.message}`);
221
+ }
222
+ process.exit(STATUTORY_EXIT_CODES.USAGE_ERROR);
223
+ }
224
+ }
225
+
226
+ async function handleDoctor() {
227
+ try {
228
+ const report = await runStatutoryDoctor({ offline: isOfflineMode });
229
+ if (isJsonMode) {
230
+ console.log(JSON.stringify(report, null, 2));
231
+ process.exit(report.exitCode);
232
+ }
233
+
234
+ console.log('\n===========================================================================');
235
+ console.log(`MUDRAFORGE STATUTORY DIAGNOSTIC DOCTOR [v${report.clientVersion}]`);
236
+ console.log('===========================================================================');
237
+
238
+ console.log('── 1. RUNTIME & HOST ENVIRONMENT ──');
239
+ console.log(`Node.js: ${report.runtime.nodeVersion} ${report.runtime.isSupportedNode ? '(Supported: v18+)' : '[UNSUPPORTED]'}`);
240
+ console.log(`Platform: ${report.runtime.platform} (${report.runtime.arch})`);
241
+ console.log(`Environment: ${report.runtime.environment}${report.runtime.isCI ? ' (CI Active)' : ''}`);
242
+ console.log(`API Key Config: ${report.runtime.hasApiKey ? 'CONFIGURED (Enterprise Tier Enabled)' : 'NOT_CONFIGURED (Free Commons Mode)'}`);
243
+
244
+ console.log('\n── 2. LOCAL OKF SUBSTRATE HEALTH ──');
245
+ if (report.substrate.valid) {
246
+ console.log(`Directory: ${DEFAULT_LOCAL_OKF_DIR}`);
247
+ console.log(`Manifest Version: v${report.substrate.okfVersion} (Published: ${report.substrate.publishedAt})`);
248
+ console.log(`Files Checked: ${report.substrate.integrity.totalFilesChecked} (0 mismatches, 0 missing, 0 untracked)`);
249
+ console.log(`Root Merkle Hash: ${report.substrate.integrity.computedRoot}`);
250
+ console.log(`Integrity: PASS`);
251
+ console.log(`Provenance: AUTHENTIC (${report.substrate.authenticity.method})`);
252
+ console.log(`Statutory Policy: PASS (All ${report.substrate.baselineCheck.baselineSections.length} mandatory baselines present)`);
253
+ } else {
254
+ console.error(`Substrate: FAILED (Exit Code ${report.substrate.exitCode})`);
255
+ if (report.substrate.error) console.error(`Error: ${report.substrate.error}`);
256
+ if (!report.substrate.integrity.valid) {
257
+ console.error(`Integrity Failure: ${report.substrate.integrity.mismatches.length} mismatch(es), ${report.substrate.integrity.missingFiles.length} missing files.`);
258
+ }
259
+ if (!report.substrate.authenticity.valid) {
260
+ console.error(`Authenticity: Root hash not authenticated.`);
261
+ }
262
+ if (!report.substrate.baselineCheck.valid) {
263
+ console.error(`Missing Baselines: ${report.substrate.baselineCheck.missingBaseline.join(', ')}`);
264
+ }
265
+ }
266
+
267
+ console.log('\n── 3. CLOUDFLARE ANYCAST EDGE CONNECTIVITY ──');
268
+ console.log(`Endpoint: ${report.edge.baseUrl}`);
269
+ if (report.edge.status === 'REACHABLE') {
270
+ console.log(`Status: REACHABLE (Latency: ${report.edge.latencyMs}ms)`);
271
+ } else if (report.edge.status === 'SKIPPED_AIR_GAPPED') {
272
+ console.log(`Status: SKIPPED (Air-Gapped / Offline Flag Enabled)`);
273
+ } else {
274
+ console.log(`Status: ${report.edge.status} (Offline-first local mode operative)`);
275
+ }
276
+ console.log(`Advisory: ${report.edge.advisory}`);
277
+
278
+ console.log('───────────────────────────────────────────────────────────────────────────');
279
+ if (report.healthy) {
280
+ console.log(`[PASS] All diagnostic checks passed with zero defects (Exit 0).\n`);
281
+ } else {
282
+ console.error(`[FAIL] Diagnostic doctor flagged health violations (Exit ${report.exitCode}).\n`);
283
+ }
284
+ process.exit(report.exitCode);
285
+ } catch (err) {
286
+ if (isJsonMode) {
287
+ console.log(JSON.stringify({ healthy: false, exitCode: STATUTORY_EXIT_CODES.USAGE_ERROR, error: err.message }, null, 2));
288
+ } else {
289
+ console.error(`[ERROR] Doctor diagnostic error: ${err.message}`);
290
+ }
291
+ process.exit(STATUTORY_EXIT_CODES.USAGE_ERROR);
292
+ }
293
+ }
294
+
295
+ async function handleCrosswalk(section, options) {
296
+ try {
297
+ const result = crosswalkStatute(section, options);
298
+ if (isJsonMode) {
299
+ console.log(JSON.stringify(result, null, 2));
300
+ process.exit(0);
301
+ }
302
+
303
+ console.log('\n===========================================================================');
304
+ console.log('MUDRAFORGE DUAL-ACT STATUTORY CROSSWALK (1961 ACT <-> 2025 ACT)');
305
+ console.log('===========================================================================');
306
+ console.log(`Query Section: ${result.querySection}`);
307
+ console.log(`Governing Statute: ${result.governingAct}`);
308
+ console.log(`Applicable Section: ${result.applicableSection}`);
309
+ console.log(`Temporal Status: ${result.temporalStatus}`);
310
+
311
+ console.log('\n── TEMPORAL CRYSTALLIZATION (EARLIER OF CREDIT OR PAYMENT) ──');
312
+ if (result.creditDate) console.log(`Credit in Books: ${result.creditDate}`);
313
+ if (result.paymentDate) console.log(`Payment Rail: ${result.paymentDate}`);
314
+ console.log(`Trigger Date: ${result.triggerDate}`);
315
+ console.log(`Trigger Event: ${result.triggerReason}`);
316
+ console.log(`Event Context: ${result.triggerDescription}`);
317
+
318
+ console.log('\n── STATUTORY BRIDGE & DUAL-ACT MAPPING ──');
319
+ console.log(`Predecessor (1961): ${result.crosswalk.predecessor.statutorySection} (${result.crosswalk.predecessor.title})`);
320
+ console.log(` Rate: ${result.crosswalk.predecessor.standardRate} | Challan: ${result.crosswalk.predecessor.challan} | Return: ${result.crosswalk.predecessor.returnForm}`);
321
+ console.log(`Successor (2025): ${result.crosswalk.successor.statutorySection} (Effective ${result.crosswalk.successor.effectiveDate})`);
322
+ console.log(` Rate: ${result.crosswalk.successor.standardRate} | Return: ${result.crosswalk.successor.returnForm}`);
323
+
324
+ console.log('\n── STATUTORY SAVINGS & LEGAL GROUNDING ──');
325
+ console.log(`Primary Authority: ${result.crosswalk.savingsAuthority.statute}`);
326
+ console.log(`Subsidiary Principle: ${result.crosswalk.savingsAuthority.subsidiary}`);
327
+ console.log(`Legal Analysis: ${result.legalAnalysis}`);
328
+
329
+ console.log('───────────────────────────────────────────────────────────────────────────');
330
+ console.log('[PASS] Statutory crosswalk resolved successfully (Exit 0).\n');
331
+ process.exit(0);
332
+ } catch (err) {
333
+ if (isJsonMode) {
334
+ console.log(JSON.stringify({ status: 'ERROR', exitCode: STATUTORY_EXIT_CODES.USAGE_ERROR, error: err.message }, null, 2));
335
+ } else {
336
+ console.error(`[ERROR] Crosswalk failure: ${err.message}`);
337
+ }
338
+ process.exit(STATUTORY_EXIT_CODES.USAGE_ERROR);
339
+ }
340
+ }
341
+
342
+ async function handleDiff(options) {
343
+ try {
344
+ const result = getStatutoryDiff(options);
345
+ if (isJsonMode) {
346
+ console.log(JSON.stringify(result, null, 2));
347
+ process.exit(0);
348
+ }
349
+
350
+ console.log('\n===========================================================================');
351
+ console.log('MUDRAFORGE STATUTORY REGULATORY CHANGELOG & AMENDMENT TRACKER');
352
+ console.log('===========================================================================');
353
+ console.log(`Filter Section: ${result.filterSection || 'ALL SECTIONS'}`);
354
+ console.log(`Filter Since: ${result.filterSince || 'ALL TIME'}`);
355
+ console.log(`Filter Domain: ${result.filterDomain || 'ALL DOMAINS'}`);
356
+ console.log(`Total Amendments: ${result.totalAmendments}`);
357
+
358
+ if (result.amendments.length === 0) {
359
+ console.log('\n[NOTICE] No statutory amendments matched the specified query filters.');
360
+ } else {
361
+ for (const am of result.amendments) {
362
+ console.log(`\n── [${am.id}] ${am.sectionCode} (${am.domain}) ──`);
363
+ console.log(`Title: ${am.title}`);
364
+ console.log(`Effective Date: ${am.effectiveDate} (${am.amendmentType})`);
365
+ console.log(`Governing Statute: ${am.statute}`);
366
+ console.log(`Enacted By: ${am.legalAuthority}`);
367
+ console.log(`Previous Baseline: ${am.previousValue}`);
368
+ console.log(`Amended Baseline: ${am.amendedValue}`);
369
+ console.log(`Summary: ${am.changeSummary}`);
370
+ console.log(`Statutory Impact: ${am.statutoryImpact}`);
371
+ }
372
+ }
373
+
374
+ console.log('───────────────────────────────────────────────────────────────────────────');
375
+ console.log(`[PASS] Statutory diff completed successfully (${result.totalAmendments} amendment(s) found) (Exit 0).\n`);
376
+ process.exit(0);
377
+ } catch (err) {
378
+ if (isJsonMode) {
379
+ console.log(JSON.stringify({ status: 'ERROR', exitCode: STATUTORY_EXIT_CODES.USAGE_ERROR, error: err.message }, null, 2));
380
+ } else {
381
+ console.error(`[ERROR] Statutory diff failure: ${err.message}`);
382
+ }
383
+ process.exit(STATUTORY_EXIT_CODES.USAGE_ERROR);
384
+ }
385
+ }
386
+
106
387
  async function handleCheckUpdate() {
107
388
  try {
108
- console.log('\n[INFO] Checking npm package version against registry.npmjs.org...');
389
+ let pkgUpdate = null;
109
390
  try {
110
- const pkgUpdate = await checkForPackageUpdate({ cacheTtlMs: 0 });
111
- if (pkgUpdate && pkgUpdate.updateAvailable) {
112
- console.log('───────────────────────────────────────────────────────────────────────────');
113
- console.log(`[WARN] New npm package version available: v${pkgUpdate.latestVersion} (installed: v${pkgUpdate.currentVersion})`);
114
- console.log(`Run: npm install @mudraforge/statutory@latest`);
115
- console.log('───────────────────────────────────────────────────────────────────────────');
116
- } else if (pkgUpdate) {
117
- console.log(`[OK] npm package code is up to date (v${pkgUpdate.currentVersion}).`);
118
- }
391
+ pkgUpdate = await checkForPackageUpdate({ cacheTtlMs: 0 });
119
392
  } catch (_) {}
120
393
 
121
- console.log('\n[INFO] Checking OKF knowledge substrate status against Cloudflare edge...');
122
394
  const status = await checkUpdates();
395
+
396
+ if (isJsonMode) {
397
+ console.log(JSON.stringify({
398
+ packageUpdate: pkgUpdate,
399
+ substrateStatus: status
400
+ }, null, 2));
401
+ process.exit(0);
402
+ }
123
403
  console.log('───────────────────────────────────────────────────────────────────────────');
124
404
  console.log(`Local OKF Version: ${status.localVersion}`);
125
405
  console.log(`Latest Edge Version: ${status.latestVersion}`);
@@ -186,6 +466,18 @@ async function handleSync(targetDir) {
186
466
  async function handleBrowse() {
187
467
  const manifest = getLocalManifest();
188
468
 
469
+ if (isJsonMode) {
470
+ console.log(JSON.stringify(manifest ? {
471
+ okfVersion: manifest.okfVersion,
472
+ publishedAt: manifest.publishedAt,
473
+ rootHash: manifest.rootHash,
474
+ totalSections: manifest.totalSections,
475
+ domains: manifest.domains,
476
+ sections: manifest.sections
477
+ } : { okfVersion: null, sections: [] }, null, 2));
478
+ process.exit(0);
479
+ }
480
+
189
481
  console.log('\n===========================================================================');
190
482
  console.log(`OPEN KNOWLEDGE FORMAT (OKF) — LOCAL BROWSER [v${manifest ? manifest.okfVersion : 'Local'}]`);
191
483
  console.log('===========================================================================');
@@ -283,18 +575,28 @@ async function handleLookup(section, asOfDate) {
283
575
  let temporalStatus = 'ACTIVE';
284
576
 
285
577
  if (s) {
286
- console.log(`\n[LOCAL OKF CACHE] Loaded section [${cleanSection}] from disk.`);
578
+ if (!isJsonMode) console.log(`\n[LOCAL OKF CACHE] Loaded section [${cleanSection}] from disk.`);
287
579
  if (asOfDate) {
288
580
  if (asOfDate < s.effectivePeriod.validFrom) temporalStatus = 'PRE_EFFECTIVE';
289
581
  else if (s.effectivePeriod.validTo && asOfDate > s.effectivePeriod.validTo) temporalStatus = 'SUNSET_SUPERSEDED';
290
582
  }
291
583
  } else {
292
- console.log(`\n[EDGE LOOKUP] Querying MudraForge Live Commons for [${cleanSection}]${asOfDate ? ` (as-of: ${asOfDate})` : ''}...`);
584
+ if (!isJsonMode) console.log(`\n[EDGE LOOKUP] Querying MudraForge Live Commons for [${cleanSection}]${asOfDate ? ` (as-of: ${asOfDate})` : ''}...`);
293
585
  const remote = await lookupStatute(cleanSection, { asOfDate });
294
586
  s = remote.statute;
295
587
  temporalStatus = remote.temporalStatus;
296
588
  }
297
589
 
590
+ if (isJsonMode) {
591
+ console.log(JSON.stringify({
592
+ status: 'SUCCESS',
593
+ sectionCode: cleanSection,
594
+ temporalStatus,
595
+ statute: s
596
+ }, null, 2));
597
+ process.exit(0);
598
+ }
599
+
298
600
  console.log('───────────────────────────────────────────────────────────────────────────');
299
601
  console.log(`Section: ${s.statutorySection} (${s.governingStatute})`);
300
602
  console.log(`Title: ${s.title}`);
@@ -324,6 +626,14 @@ async function handleLookup(section, asOfDate) {
324
626
  }
325
627
  console.log('───────────────────────────────────────────────────────────────────────────\n');
326
628
  } catch (err) {
629
+ if (isJsonMode) {
630
+ console.error(JSON.stringify({
631
+ status: 'ERROR',
632
+ error: err.message,
633
+ availableSections: err.availableSections || []
634
+ }, null, 2));
635
+ process.exit(1);
636
+ }
327
637
  console.error(`[ERROR] Lookup failed: ${err.message}`);
328
638
  if (err.availableSections) {
329
639
  console.log(`Available sections: ${err.availableSections.join(', ')}`);
@@ -334,8 +644,13 @@ async function handleLookup(section, asOfDate) {
334
644
 
335
645
  async function handleList() {
336
646
  try {
337
- console.log('\n[INFO] Fetching indexed statutory sections from MudraForge Commons...');
338
647
  const sections = await listSections();
648
+ if (isJsonMode) {
649
+ console.log(JSON.stringify({ sections, total: sections.length }, null, 2));
650
+ process.exit(0);
651
+ }
652
+
653
+ console.log('\n[INFO] Fetching indexed statutory sections from MudraForge Commons...');
339
654
  console.log('───────────────────────────────────────────────────────────────────────────');
340
655
  for (const s of sections) {
341
656
  const displayValidTo = (s.validTo === 'OPEN_ENDED' || s.validTo === '2099-12-31') ? 'In Force' : s.validTo;
@@ -343,6 +658,10 @@ async function handleList() {
343
658
  }
344
659
  console.log('───────────────────────────────────────────────────────────────────────────\n');
345
660
  } catch (err) {
661
+ if (isJsonMode) {
662
+ console.error(JSON.stringify({ status: 'ERROR', error: err.message }, null, 2));
663
+ process.exit(1);
664
+ }
346
665
  console.error(`[ERROR] Failed to list sections: ${err.message}`);
347
666
  process.exit(1);
348
667
  }
@@ -350,6 +669,11 @@ async function handleList() {
350
669
 
351
670
  function handleDecodeId(rawId) {
352
671
  const res = decodeTaxIdentifier(rawId);
672
+ if (isJsonMode) {
673
+ console.log(JSON.stringify(res, null, 2));
674
+ process.exit(res.isValid ? 0 : 1);
675
+ }
676
+
353
677
  console.log('\n===========================================================================');
354
678
  console.log('INDIAN TAX IDENTIFIER DECODER & OFFLINE MOD-36 VALIDATOR');
355
679
  console.log('===========================================================================');
@@ -382,6 +706,10 @@ Usage:
382
706
  npx @mudraforge/statutory <command> [options]
383
707
 
384
708
  Commands:
709
+ doctor [--offline] Run full diagnostic check of runtime, substrate integrity, & edge status
710
+ verify [path] Cryptographically verify OKF substrate authenticity & file integrity
711
+ crosswalk <section> Dual-act 1961 <-> 2025 bridge (earlier of credit vs payment)
712
+ diff Semantic regulatory changelog (--section, --since, --domain)
385
713
  browse Interactively browse local OKF statutory filesystem
386
714
  lookup <section> [date] Look up section details & temporal status (e.g. 194Q 2025-06-01)
387
715
  decode-id <pan_or_gstin> Offline ISO Mod-36 checksum, state name, and PAN entity decoding
@@ -390,6 +718,21 @@ Commands:
390
718
  list List all indexed statutory sections
391
719
  init-skill [path] Install SKILL.md into your agent workspace (defaults to .agents/skills/)
392
720
  help Show this help message
721
+
722
+ Options:
723
+ --credit <YYYY-MM-DD> Date of credit to vendor/payee account in books (used in crosswalk)
724
+ --payment <YYYY-MM-DD> Date of actual payment/disbursement (used in crosswalk)
725
+ --since <YYYY-MM-DD> Filter amendments taking effect on or after date (used in diff)
726
+ --section, -s <section> Filter amendments by section code (used in diff)
727
+ --domain <domain> Filter amendments by statutory domain (used in diff)
728
+ --json, -j Emit clean, machine-parseable JSON to stdout (suppresses banners)
729
+ --offline, -o Bypass outbound network checks (air-gapped / offline environment mode)
730
+
731
+ Exit Code Conventions:
732
+ 0 Success / Verification passed
733
+ 1 Usage or operational error (invalid syntax / parameters)
734
+ 2 Cryptographic authenticity or integrity violation (mismatch/revocation)
735
+ 3 Statutory policy violation (e.g. missing baseline provision)
393
736
  `);
394
737
  }
395
738
 
@@ -3,7 +3,7 @@
3
3
  > **Format Reference**: Inspired by Google's *Data Cards Playbook* and the OpenSSF Project Quality Standards.
4
4
  > **Target Package**: `@mudraforge/statutory` v2.4.0
5
5
  > **Evaluation Mode**: Machine-audited against primary sources, official gazettes, and test fixtures.
6
- > **Generated Timestamp**: 2026-10-24T15:20:46.069Z
6
+ > **Generated Timestamp**: 2026-10-25T19:16:47.828Z
7
7
 
8
8
  ---
9
9
 
@@ -11,11 +11,11 @@
11
11
 
12
12
  | Dimension | Metric | Denominator / Baseline | Coverage Rate | Status |
13
13
  | :--- | :--- | :--- | :--- | :--- |
14
- | **Primary Source Citations** | 30 resolvable gazette URLs | 30 total citations declared | **100.0%** | VERIFIED |
15
- | **Temporal Validity Bounds** | 11 sections with explicit dates | 11 total bundled sections | **100.0%** | VERIFIED |
16
- | **Dual-Act 2025 Transition Bridges** | 6 direct tax provisions mapped | 7 direct tax provisions | **85.7%** | VERIFIED |
17
- | **Attached Administrative Circulars** | 11 official circulars | 6 sections across 4 domains | **100% Attached** | VERIFIED |
18
- | **Attached Return/Compliance Schemas** | 14 schemas/templates | 6 sections across 4 domains | **100% Attached** | VERIFIED |
14
+ | **Primary Source Citations** | 61 resolvable gazette URLs | 61 total citations declared | **100.0%** | VERIFIED |
15
+ | **Temporal Validity Bounds** | 24 sections with explicit dates | 24 total bundled sections | **100.0%** | VERIFIED |
16
+ | **Dual-Act 2025 Transition Bridges** | 8 direct tax provisions mapped | 9 direct tax provisions | **88.9%** | VERIFIED |
17
+ | **Attached Administrative Circulars** | 25 official circulars | 6 sections across 4 domains | **100% Attached** | VERIFIED |
18
+ | **Attached Return/Compliance Schemas** | 22 schemas/templates | 6 sections across 4 domains | **100% Attached** | VERIFIED |
19
19
  | **Cryptographic Merkle Verification** | 20 bundle files verified | SHA-256 Merkle root digest | **0 Mismatches** | VERIFIED |
20
20
 
21
21
  ---
@@ -49,16 +49,29 @@
49
49
  | Section Code | Statutory Provision | Governing Statute | Temporal Window | Status | Citations | Circulars | Forms | 2025 Act Successor |
50
50
  | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
51
51
  | **50B** | Special provision for computation of capital gains in case of slump sale | Income-tax Act, 1961 (Act No. 43 of 1961) | `2000-04-01` to `OPEN_ENDED` | `ACTIVE` | 3 | 2 | 2 | Income-tax Act, 2025 (Section 78 (Capital gains on slump sale of undertakings)) |
52
+ | **206AB** | Special provision for deduction of tax at source for non-filers of income-tax return | Income-tax Act, 1961 (Act No. 43 of 1961) | `2021-07-01` to `OPEN_ENDED` | `ACTIVE` | 1 | 1 | 0 | Income-tax Act, 2025 (Section 397(3)) |
52
53
  | **206C(1H)** | Collection of tax at source by seller on receipt of consideration for sale of goods (Omitted effective 1 April 2025) | Income-tax Act, 1961 | `2020-10-01` to `2025-03-31` | `SUNSET_SUPERSEDED` | 2 | 1 | 0 | Finance Act, 2025 (Statutory Sunset) (Section 206C(1H) Omitted) |
53
54
  | **194H** | Deduction of tax at source on commission or brokerage | Income-tax Act, 1961 (Act No. 43 of 1961) | `2001-06-01` to `2026-03-31` | `SUNSET_SUPERSEDED` | 3 | 1 | 1 | Income-tax Act, 2025 (Section 393(1), Table 4, Item (i)) |
54
55
  | **194C** | Deduction of tax at source on payments to contractors and sub-contractors | Income-tax Act, 1961 (Act No. 43 of 1961) | `1972-04-01` to `2026-03-31` | `SUNSET_SUPERSEDED` | 3 | 1 | 2 | Income-tax Act, 2025 (Section 393(1), Table 3, Item (i)) |
55
56
  | **194Q** | Deduction of tax at source on payment of a certain sum for purchase of goods | Income-tax Act, 1961 (Act No. 43 of 1961) | `2021-07-01` to `2026-03-31` | `SUNSET_SUPERSEDED` | 2 | 2 | 2 | Income-tax Act, 2025 (Section 393(1), Table 8, Item (ii)) |
56
57
  | **393** | Deduction of tax at source on payment of a certain sum for purchase of goods | Income-tax Act, 2025 (Act No. 1 of 2025) | `2026-04-01` to `OPEN_ENDED` | `ACTIVE` | 3 | 0 | 0 | N/A |
58
+ | **194R** | Deduction of tax at source on benefit or perquisite in respect of business or profession | Income-tax Act, 1961 (Act No. 43 of 1961) | `2022-07-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 0 | Income-tax Act, 2025 (Section 393(1), Table 8, Item 12) |
57
59
  | **194I** | Deduction of tax at source on payment of rent | Income-tax Act, 1961 (Act No. 43 of 1961) | `1994-06-01` to `2026-03-31` | `SUNSET_SUPERSEDED` | 3 | 1 | 1 | Income-tax Act, 2025 (Section 393(1), Table 5, Item (i)) |
58
60
  | **194J** | Fees for professional or technical services, royalty, and non-compete fees | Income-tax Act, 1961 | `1995-07-01` to `2026-03-31` | `SUNSET_SUPERSEDED` | 2 | 1 | 1 | Income-tax Act, 2025 (Section 393(1), Table 6, Item (iii)) |
59
61
  | **17(5)** | Apportionment of credit and blocked input tax credits | Central Goods and Services Tax Act, 2017 (Act No. 12 of 2017) | `2017-07-01` to `OPEN_ENDED` | `ACTIVE` | 3 | 1 | 1 | CGST Act, 2017 (In force) (Section 17(5)(b)(i) & (b)(iii)) |
62
+ | **8** | Tax liability on composite and mixed supplies and classification of bundled goods and services contracts | Central Goods and Services Tax Act, 2017 | `2017-07-01` to `OPEN_ENDED` | `ACTIVE` | 3 | 1 | 1 | N/A |
63
+ | **10** | Composition levy and ineligible tax invoice restrictions | Central Goods and Services Tax Act, 2017 (Act No. 12 of 2017) | `2017-07-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 0 | N/A |
64
+ | **34** | Credit and debit notes statutory adjustments and return filing deadlines | Central Goods and Services Tax Act, 2017 (Act No. 12 of 2017) | `2017-07-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 0 | N/A |
65
+ | **RULE-48(4)** | Mandatory electronic invoicing (E-Invoicing), IRN generation, and invoice validity | Central Goods and Services Tax Rules, 2017 | `2020-10-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 0 | N/A |
66
+ | **51** | Tax deduction at source under Goods and Services Tax | Central Goods and Services Tax Act, 2017 (Act No. 12 of 2017) | `2018-10-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 0 | N/A |
67
+ | **16(2)** | Eligibility and conditions for taking input tax credit and mandatory 180-day payment rule | Central Goods and Services Tax Act, 2017 (Act No. 12 of 2017) | `2017-07-01` to `OPEN_ENDED` | `ACTIVE` | 4 | 1 | 1 | CGST Act, 2017 (In force) (Section 16(2), (3), (4), (5), (6)) |
68
+ | **9(3)** | Reverse Charge Mechanism (RCM) mandatory tax liability on recipient, self-invoicing, payment voucher issuance, and electronic cash discharge | Central Goods and Services Tax Act, 2017 read with Notification No. 13/2017-Central Tax (Rate) | `2017-07-01` to `OPEN_ENDED` | `ACTIVE` | 3 | 1 | 1 | N/A |
69
+ | **195** | Deduction of tax at source on foreign cross-border payments to non-residents, DTAA treaty benefits, documentation, Form 15CA/15CB, and cloud software exemption | Income-tax Act, 1961 read with Double Taxation Avoidance Agreements (DTAA) under Section 90 | `1962-04-01` to `OPEN_ENDED` | `ACTIVE` | 3 | 2 | 1 | Income-tax Act, 2025 Section 393(2) (Section 393(2) of Income-tax Act, 2025) |
60
70
  | **IRC-901-904** | Foreign Tax Credit authorization, separate basket limitation, and partnership pass-through reporting (Form 1116 / Schedule K-3) | Internal Revenue Code of 1986 (Title 26, U.S. Code) | `2021-01-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 0 | 2 | Title 26, U.S. Code (Continuous) (26 U.S.C. §§ 901, 904(d), 904(j), 469) |
61
71
  | **MSMED-15-16** | Statutory payment timelines to Micro & Small Enterprises, compound penal interest, and income tax deduction disallowance | Micro, Small and Medium Enterprises Development Act, 2006 read with Income-tax Act, 1961 Section 43B(h) | `2006-10-02` to `OPEN_ENDED` | `ACTIVE` | 4 | 1 | 2 | Income-tax Act, 2025 Section 37(2)(g) (Section 37(2)(g) of Income-tax Act, 2025) |
72
+ | **MSMED-SEC-7** | Composite criteria for classification of Micro, Small and Medium Enterprises, investment calculations, and statutory exclusion of export turnover | Micro, Small and Medium Enterprises Development Act, 2006 read with Ministry of MSME Notification S.O. 2119(E) | `2020-07-01` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 1 | N/A |
73
+ | **MCA-MSME-1** | Mandatory half-yearly reporting of outstanding dues exceeding 45 days to Micro & Small Enterprises (Form MSME-1) | Companies Act, 2013 read with Specified Companies (Furnishing of information about payment to micro and small enterprise suppliers) Order, 2019 | `2019-01-22` to `OPEN_ENDED` | `ACTIVE` | 2 | 1 | 1 | N/A |
74
+ | **MSMED-SEC-22** | Mandatory statutory disclosures in annual audited financial statements regarding dues to Micro and Small Enterprises and tax non-deductibility of penal interest | Micro, Small and Medium Enterprises Development Act, 2006 read with Companies Act, 2013 Schedule III | `2006-10-02` to `OPEN_ENDED` | `ACTIVE` | 3 | 1 | 2 | N/A |
62
75
 
63
76
  ---
64
77
 
@@ -0,0 +1,33 @@
1
+ # Published Release & Provenance Ledger
2
+
3
+ This document records the cryptographic provenance, normative specifications, and formal assurance artifacts for `@mudraforge/statutory`.
4
+
5
+ ---
6
+
7
+ ## Release Baseline Ledger
8
+
9
+ | Item | Value |
10
+ |---|---|
11
+ | **Package Release** | **`v2.8.1`** (Stable Patch Release) |
12
+ | **Knowledge Specification** | **Google Open Knowledge Format (OKF v0.2) + MudraForge Statutory Schema Extension** |
13
+ | **Regulatory Snapshot** | **CBDT / CBIC / MCA / MSME Baseline: October 2026** |
14
+ | **Corpus Quality Card** | 100% Citation Resolution (15/15 URLs) in [`docs/CORPUS_QUALITY.md`](./CORPUS_QUALITY.md) |
15
+ | **Architecture Decision Records** | 6 Normative ADRs documented in [`docs/ARCHITECTURE_DECISIONS.md`](./ARCHITECTURE_DECISIONS.md) |
16
+ | **Vendor Conformance Suite** | 12/12 Passing Fixture Tests in [`conformance/`](../conformance/) |
17
+ | **End-to-End Execution Trace** | Audited 7-stage AP lifecycle in [`examples/`](../examples/) (`npm run example:trace`) |
18
+ | **Enterprise Assurance Preview** | Formal TLA+ & mutation defenses in [`docs/ADESHA_ASSURANCE_OVERVIEW.md`](./ADESHA_ASSURANCE_OVERVIEW.md) |
19
+ | **Integrity Root** | SHA-256 root manifest in [`okf/manifest.json`](../okf/manifest.json) (reproducible byte-level non-tampering proof) |
20
+ | **Temporal Framework** | Dual-Act Bridge: *Income-tax Act, 1961* & *Income-tax Act, 2025* |
21
+ | **Verification Gate** | 100% Pass across cumulative thresholds, legislative sunsets, and excess math |
22
+
23
+ ---
24
+
25
+ ## Cryptographic & Epistemic Scope
26
+
27
+ The SHA-256 root hash in `okf/manifest.json` provides mathematical verification of **byte-level integrity** (ensuring local files have not been corrupted, altered, or partially written). A hash certifies that bytes match the published release; it does not by itself constitute legal or statutory authority.
28
+
29
+ Epistemic authority is established strictly via:
30
+ 1. Primary gazette citations and statutory text enacted by Parliament.
31
+ 2. Executive circulars and notifications issued by the CBDT, CBIC, MCA, and Ministry of MSME.
32
+ 3. Cryptographic Ed25519 signatures anchored to the MudraForge Root Authority.
33
+ 4. Independent legal ground-truth test suites parameterizing effective dates and cumulative turnover thresholds.
@@ -8,7 +8,7 @@ valid_from: 2021-04-01
8
8
  valid_to: OPEN_ENDED
9
9
  temporal_status: ACTIVE
10
10
  subject: Computation of Full Value of Consideration for Slump Sale under Section 50B(2)(ii)
11
- official_url: https://www.incometaxindia.gov.in/pages/communications/notifications.aspx
11
+ official_url: https://www.incometaxindia.gov.in/w/notification-no.68/2021-f.-no.370142/16/2021-tpl-/-gsr-338-e-income-tax-16th-amendment-rules-2021
12
12
  ---
13
13
 
14
14
  > [STATUTORY VALIDITY WINDOW & TEMPORAL STATUS]
@@ -8,7 +8,7 @@ valid_from: 2017-07-01
8
8
  valid_to: OPEN_ENDED
9
9
  temporal_status: ACTIVE
10
10
  subject: Services by way of transfer of a going concern, as a whole or an independent part thereof, attract 0% GST (exempt supply)
11
- official_url: https://taxinformation.cbic.gov.in/
11
+ official_url: https://cbic-gst.gov.in/hindi/pdf/central-tax-rate/Notification12-CGST.pdf
12
12
  ---
13
13
 
14
14
  > [STATUTORY VALIDITY WINDOW & TEMPORAL STATUS]
@@ -46,13 +46,13 @@
46
46
  "authority": "Central Board of Direct Taxes (CBDT)",
47
47
  "instrument": "Notification No. 68/2021 (Dated 24 May 2021)",
48
48
  "subject": "Rule 11UAE: Computation of fair market value of capital assets for the purposes of section 50B",
49
- "officialUrl": "https://www.incometaxindia.gov.in/pages/communications/notifications.aspx"
49
+ "officialUrl": "https://www.incometaxindia.gov.in/w/notification-no.68/2021-f.-no.370142/16/2021-tpl-/-gsr-338-e-income-tax-16th-amendment-rules-2021"
50
50
  },
51
51
  {
52
52
  "authority": "Central Board of Indirect Taxes and Customs (CBIC)",
53
53
  "instrument": "Notification No. 12/2017-Central Tax (Rate) Entry 2",
54
54
  "subject": "Services by way of transfer of a going concern, as a whole or an independent part thereof, attract 0% GST",
55
- "officialUrl": "https://taxinformation.cbic.gov.in/"
55
+ "officialUrl": "https://cbic-gst.gov.in/hindi/pdf/central-tax-rate/Notification12-CGST.pdf"
56
56
  }
57
57
  ],
58
58
  "requiredDocumentChecklist": [
@@ -7,7 +7,7 @@ statutory_section: 206AB
7
7
  valid_from: 2021-07-01
8
8
  valid_to: OPEN_ENDED
9
9
  temporal_status: ACTIVE
10
- official_url: https://www.incometaxindia.gov.in/pages/communications/circulars.aspx
10
+ official_url: https://www.incometaxindia.gov.in/w/circular-no.-11/2021-circular-regarding-use-of-functionality-under-section-206ab-and-206cca-of-the-income-tax-act-1961
11
11
  ---
12
12
 
13
13
  # CBDT Circular No. 11 of 2021 — Compliance Check for Section 206AB
@@ -42,7 +42,7 @@
42
42
  "authority": "Central Board of Direct Taxes (CBDT)",
43
43
  "instrument": "Circular No. 11 of 2021",
44
44
  "subject": "Compliance Check functionality for Section 206AB & Section 206CCA",
45
- "officialUrl": "https://www.incometaxindia.gov.in/pages/communications/circulars.aspx"
45
+ "officialUrl": "https://www.incometaxindia.gov.in/w/circular-no.-11/2021-circular-regarding-use-of-functionality-under-section-206ab-and-206cca-of-the-income-tax-act-1961"
46
46
  }
47
47
  ],
48
48
  "requiredDocumentChecklist": [
@@ -10,7 +10,7 @@ valid_to: 2025-03-31
10
10
  temporal_status: SUNSET_OMITTED
11
11
  sunset_effective_date: 2025-04-01
12
12
  successor_rule: Section 194Q buyer TDS applies conditionally
13
- official_url: https://www.incometaxindia.gov.in/pages/communications/circulars.aspx
13
+ official_url: https://www.incometaxindia.gov.in/pages/acts/finance-acts.aspx
14
14
  ---
15
15
 
16
16
  > [TEMPORAL STATUS: SUNSET & OMITTED]