traceiq 0.3.2__tar.gz → 0.3.4__tar.gz

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 (88) hide show
  1. {traceiq-0.3.2 → traceiq-0.3.4}/.gitignore +4 -0
  2. {traceiq-0.3.2 → traceiq-0.3.4}/LICENSE +1 -1
  3. {traceiq-0.3.2 → traceiq-0.3.4}/MATH.md +41 -0
  4. traceiq-0.3.4/PKG-INFO +356 -0
  5. traceiq-0.3.4/README.md +307 -0
  6. traceiq-0.3.4/docs/THEORY.md +317 -0
  7. traceiq-0.3.4/docs/architecture.md +98 -0
  8. traceiq-0.3.4/docs/configuration.md +131 -0
  9. traceiq-0.3.4/docs/integration.md +350 -0
  10. {traceiq-0.3.2 → traceiq-0.3.4}/docs/metrics.md +16 -0
  11. traceiq-0.3.4/experiments/README.md +229 -0
  12. traceiq-0.3.4/experiments/data/tasks_math.jsonl +50 -0
  13. traceiq-0.3.4/experiments/mcp_demo_client.py +174 -0
  14. traceiq-0.3.4/experiments/mcp_server_traceiq.py +217 -0
  15. traceiq-0.3.4/experiments/plot_all.py +877 -0
  16. traceiq-0.3.4/experiments/run_comparison.py +486 -0
  17. traceiq-0.3.4/experiments/run_exp1_wrong_hint.py +216 -0
  18. traceiq-0.3.4/experiments/run_exp2_propagation.py +293 -0
  19. traceiq-0.3.4/experiments/run_exp3_mitigation.py +333 -0
  20. traceiq-0.3.4/experiments/run_metric_properties.py +631 -0
  21. traceiq-0.3.4/experiments/run_stats_analysis.py +546 -0
  22. traceiq-0.3.4/experiments/stats.py +526 -0
  23. traceiq-0.3.4/experiments/utils.py +386 -0
  24. {traceiq-0.3.2 → traceiq-0.3.4}/pyproject.toml +1 -1
  25. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/__init__.py +24 -0
  26. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/cli.py +226 -0
  27. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/graph.py +167 -12
  28. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/metrics.py +67 -3
  29. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/models.py +50 -1
  30. traceiq-0.3.4/src/traceiq/policy.py +383 -0
  31. traceiq-0.3.4/src/traceiq/report.py +446 -0
  32. traceiq-0.3.4/src/traceiq/risk.py +346 -0
  33. traceiq-0.3.4/src/traceiq/robust_stats.py +105 -0
  34. traceiq-0.3.4/src/traceiq/schema.py +185 -0
  35. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/scoring.py +23 -9
  36. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/tracker.py +178 -16
  37. traceiq-0.3.4/src/traceiq/validity.py +180 -0
  38. traceiq-0.3.4/src/traceiq/weights.py +203 -0
  39. traceiq-0.3.4/tests/test_calibration.py +169 -0
  40. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_metrics.py +100 -4
  41. traceiq-0.3.4/tests/test_policy.py +395 -0
  42. traceiq-0.3.4/tests/test_risk.py +259 -0
  43. traceiq-0.3.4/tests/test_schema.py +248 -0
  44. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_scoring.py +149 -0
  45. traceiq-0.3.4/tests/test_validity.py +234 -0
  46. traceiq-0.3.4/tests/test_weights.py +208 -0
  47. traceiq-0.3.2/PKG-INFO +0 -661
  48. traceiq-0.3.2/README.md +0 -612
  49. {traceiq-0.3.2 → traceiq-0.3.4}/.github/workflows/ci.yml +0 -0
  50. {traceiq-0.3.2 → traceiq-0.3.4}/.github/workflows/publish-testpypi.yml +0 -0
  51. {traceiq-0.3.2 → traceiq-0.3.4}/.github/workflows/publish.yml +0 -0
  52. {traceiq-0.3.2 → traceiq-0.3.4}/.pre-commit-config.yaml +0 -0
  53. {traceiq-0.3.2 → traceiq-0.3.4}/CHANGELOG.md +0 -0
  54. {traceiq-0.3.2 → traceiq-0.3.4}/CLAUDE.md +0 -0
  55. {traceiq-0.3.2 → traceiq-0.3.4}/CONTRIBUTING.md +0 -0
  56. {traceiq-0.3.2 → traceiq-0.3.4}/SECURITY.md +0 -0
  57. {traceiq-0.3.2 → traceiq-0.3.4}/docs/api/index.md +0 -0
  58. {traceiq-0.3.2 → traceiq-0.3.4}/docs/cli.md +0 -0
  59. {traceiq-0.3.2 → traceiq-0.3.4}/docs/examples.md +0 -0
  60. {traceiq-0.3.2 → traceiq-0.3.4}/docs/index.md +0 -0
  61. {traceiq-0.3.2 → traceiq-0.3.4}/docs/installation.md +0 -0
  62. {traceiq-0.3.2 → traceiq-0.3.4}/docs/quickstart.md +0 -0
  63. {traceiq-0.3.2 → traceiq-0.3.4}/examples/output/.gitkeep +0 -0
  64. {traceiq-0.3.2 → traceiq-0.3.4}/examples/simulate_infection.py +0 -0
  65. {traceiq-0.3.2 → traceiq-0.3.4}/examples/smoke.py +0 -0
  66. {traceiq-0.3.2 → traceiq-0.3.4}/examples/test_real_agents.py +0 -0
  67. {traceiq-0.3.2 → traceiq-0.3.4}/mkdocs.yml +0 -0
  68. {traceiq-0.3.2 → traceiq-0.3.4}/notebooks/demo.ipynb +0 -0
  69. {traceiq-0.3.2 → traceiq-0.3.4}/research/__init__.py +0 -0
  70. {traceiq-0.3.2 → traceiq-0.3.4}/research/ablation_study.py +0 -0
  71. {traceiq-0.3.2 → traceiq-0.3.4}/research/sensitivity_analysis.py +0 -0
  72. {traceiq-0.3.2 → traceiq-0.3.4}/research/synthetic_simulation.py +0 -0
  73. {traceiq-0.3.2 → traceiq-0.3.4}/ruff.toml +0 -0
  74. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/capabilities.py +0 -0
  75. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/embeddings.py +0 -0
  76. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/export.py +0 -0
  77. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/plotting.py +0 -0
  78. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/storage/__init__.py +0 -0
  79. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/storage/base.py +0 -0
  80. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/storage/memory.py +0 -0
  81. {traceiq-0.3.2 → traceiq-0.3.4}/src/traceiq/storage/sqlite.py +0 -0
  82. {traceiq-0.3.2 → traceiq-0.3.4}/tests/conftest.py +0 -0
  83. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_canonical_metrics.py +0 -0
  84. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_capabilities.py +0 -0
  85. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_export.py +0 -0
  86. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_plotting.py +0 -0
  87. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_pypi_safety.py +0 -0
  88. {traceiq-0.3.2 → traceiq-0.3.4}/tests/test_storage_sqlite.py +0 -0
@@ -87,6 +87,10 @@ examples/output/*.png
87
87
  examples/output/*.csv
88
88
  examples/output/*.jsonl
89
89
 
90
+ # Experiments output
91
+ experiments/results/*.csv
92
+ experiments/plots/*.png
93
+
90
94
  # macOS
91
95
  .DS_Store
92
96
 
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 TraceIQ Contributors
3
+ Copyright (c) 2026 TraceIQ Contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -88,6 +88,47 @@ $$\text{drift}_\text{cosine} = 1 - \frac{s_j(t^+) \cdot s_j(t^-)}{\|s_j(t^+)\| \
88
88
 
89
89
  ---
90
90
 
91
+ ## Counterfactual Influence
92
+
93
+ ### Formal Definition
94
+
95
+ The **counterfactual influence** of agent $i$ on agent $j$ at time $t$ is formally defined as:
96
+
97
+ $$I_{\text{CF}}(i \to j, t) = D(S_j(t^+), S_j^{\emptyset}(t^+))$$
98
+
99
+ where:
100
+ - $S_j(t^+)$ is agent $j$'s state after receiving message $M_i$ from agent $i$
101
+ - $S_j^{\emptyset}(t^+)$ is the **counterfactual** state agent $j$ would have had without receiving $M_i$
102
+ - $D(\cdot, \cdot)$ is a distance metric (L2 norm)
103
+
104
+ **Interpretation**: Counterfactual influence measures the difference between what happened and what *would have happened* without the interaction.
105
+
106
+ ### Observable Approximation
107
+
108
+ Computing $S_j^{\emptyset}(t^+)$ requires running the agent without the message, which is expensive and often impractical. TraceIQ uses an **observable approximation**:
109
+
110
+ $$\hat{I}(i \to j, t) = D(S_j(t^+), S_j(t^-))$$
111
+
112
+ where $S_j(t^-)$ is agent $j$'s state immediately before receiving $M_i$.
113
+
114
+ ### Justification
115
+
116
+ Under the **local stability assumption** (in the absence of external input, agent behavior is locally stable over short time intervals):
117
+
118
+ $$S_j^{\emptyset}(t^+) \approx S_j(t^-)$$
119
+
120
+ This approximation measures the actual state change, attributing it to the interaction. The error in this approximation is bounded by the agent's baseline variance.
121
+
122
+ ### Relationship to IQx
123
+
124
+ The Influence Quotient (IQx) normalizes the observable influence by baseline:
125
+
126
+ $$\text{IQx}(i \to j, t) = \frac{\hat{I}(i \to j, t)}{B_j + \varepsilon} = \frac{D(S_j(t^+), S_j(t^-))}{B_j + \varepsilon}$$
127
+
128
+ This connects the theoretical counterfactual definition to the practical IQx metric.
129
+
130
+ ---
131
+
91
132
  ## Influence Quotient (IQx)
92
133
 
93
134
  The Influence Quotient normalizes drift by receiver baseline:
traceiq-0.3.4/PKG-INFO ADDED
@@ -0,0 +1,356 @@
1
+ Metadata-Version: 2.3
2
+ Name: traceiq
3
+ Version: 0.3.4
4
+ Summary: Measure AI-to-AI influence in multi-agent systems
5
+ Project-URL: Homepage, https://github.com/Anarv2104/TraceIQ
6
+ Project-URL: Documentation, https://github.com/Anarv2104/TraceIQ#readme
7
+ Project-URL: Repository, https://github.com/Anarv2104/TraceIQ
8
+ Author: TraceIQ Contributors
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: agents,ai,embeddings,ieee,influence,research,security,tracking
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Classifier: Topic :: Security
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: click>=8.0
24
+ Requires-Dist: networkx>=3.0
25
+ Requires-Dist: numpy>=1.24
26
+ Requires-Dist: pydantic>=2.0
27
+ Requires-Dist: rich>=13.0
28
+ Provides-Extra: all
29
+ Requires-Dist: matplotlib>=3.7; extra == 'all'
30
+ Requires-Dist: pandas>=2.0; extra == 'all'
31
+ Requires-Dist: scipy>=1.10; extra == 'all'
32
+ Requires-Dist: sentence-transformers>=2.2; extra == 'all'
33
+ Provides-Extra: dev
34
+ Requires-Dist: pytest>=7.0; extra == 'dev'
35
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
36
+ Provides-Extra: docs
37
+ Requires-Dist: mkdocs-material>=9.0; extra == 'docs'
38
+ Requires-Dist: mkdocs>=1.5; extra == 'docs'
39
+ Provides-Extra: embedding
40
+ Requires-Dist: sentence-transformers>=2.2; extra == 'embedding'
41
+ Provides-Extra: plot
42
+ Requires-Dist: matplotlib>=3.7; extra == 'plot'
43
+ Provides-Extra: research
44
+ Requires-Dist: jupyterlab>=4.0; extra == 'research'
45
+ Requires-Dist: matplotlib>=3.7; extra == 'research'
46
+ Requires-Dist: pandas>=2.0; extra == 'research'
47
+ Requires-Dist: scipy>=1.10; extra == 'research'
48
+ Description-Content-Type: text/markdown
49
+
50
+ # TraceIQ
51
+
52
+ **Measure AI-to-AI Influence in Multi-Agent Systems**
53
+
54
+ [![PyPI version](https://img.shields.io/pypi/v/traceiq.svg?cacheSeconds=60)](https://pypi.org/project/traceiq/)
55
+ [![Python versions](https://img.shields.io/pypi/pyversions/traceiq.svg?cacheSeconds=60)](https://pypi.org/project/traceiq/)
56
+ [![License](https://img.shields.io/pypi/l/traceiq.svg?cacheSeconds=60)](https://pypi.org/project/traceiq/)
57
+
58
+ ---
59
+
60
+ ## What It Is
61
+
62
+ - Tracks and quantifies how AI agents influence each other in multi-agent systems
63
+ - Uses semantic embeddings to measure state changes between interactions
64
+ - Provides network-level analysis of influence propagation
65
+ - Includes anomaly detection for unusual influence patterns
66
+ - Supports research with IEEE-standard metrics (IQx, RWI, Z-score)
67
+
68
+ ## What It Does NOT Measure
69
+
70
+ - **Causal attribution**: TraceIQ detects correlation, not causation
71
+ - **Intent**: Cannot determine if influence is intentional or benign
72
+ - **Content analysis**: Does not parse meaning, only embedding similarity
73
+ - **Internal state**: Measures observable outputs, not agent cognition
74
+
75
+ ## Research Context
76
+
77
+ TraceIQ is developed as part of research on AI-to-AI influence and multi-agent coordination. The metrics are grounded in a formal mathematical framework documented in [MATH.md](MATH.md) and [docs/THEORY.md](docs/THEORY.md).
78
+
79
+ ---
80
+
81
+ ## Quickstart
82
+
83
+ ```python
84
+ from traceiq import InfluenceTracker
85
+
86
+ # Create tracker (use_mock_embedder=True for testing without sentence-transformers)
87
+ tracker = InfluenceTracker(use_mock_embedder=True)
88
+
89
+ # Track an interaction
90
+ result = tracker.track_event(
91
+ sender_id="agent_a",
92
+ receiver_id="agent_b",
93
+ sender_content="We should all switch to renewable energy!",
94
+ receiver_content="You make a good point. Renewables are the future.",
95
+ )
96
+
97
+ # Access metrics
98
+ print(f"State Drift: {result['drift_l2_state']}")
99
+ print(f"IQx: {result['IQx']}")
100
+ print(f"Alert: {result['alert']}")
101
+ print(f"Risk Level: {result['risk_level']}")
102
+
103
+ tracker.close()
104
+ ```
105
+
106
+ ## Installation
107
+
108
+ ```bash
109
+ # Core installation
110
+ pip install traceiq
111
+
112
+ # With plotting support (matplotlib)
113
+ pip install "traceiq[plot]"
114
+
115
+ # With real embeddings (sentence-transformers)
116
+ pip install "traceiq[embedding]"
117
+
118
+ # Everything included
119
+ pip install "traceiq[all]"
120
+ ```
121
+
122
+ ### Development Installation
123
+
124
+ ```bash
125
+ git clone https://github.com/Anarv2104/TraceIQ.git
126
+ cd TraceIQ
127
+ pip install -e ".[all,dev]"
128
+ ```
129
+
130
+ ---
131
+
132
+ ## Metrics Overview
133
+
134
+ | Metric | What It Captures |
135
+ |--------|------------------|
136
+ | **State Drift** | How much a receiver's output changed after an interaction |
137
+ | **Influence Quotient (IQx)** | Normalized influence relative to baseline responsiveness |
138
+ | **Propagation Risk (PR)** | Network-level instability (spectral radius > 1.0 = amplification) |
139
+ | **Risk-Weighted Influence (RWI)** | IQx adjusted for sender's attack surface |
140
+ | **Z-score** | Anomaly detection (values > threshold trigger alerts) |
141
+
142
+ For detailed metric documentation, see [docs/metrics.md](docs/metrics.md).
143
+
144
+ ---
145
+
146
+ ## Basic Usage
147
+
148
+ ### Track Multiple Interactions
149
+
150
+ ```python
151
+ interactions = [
152
+ {
153
+ "sender_id": "agent_a",
154
+ "receiver_id": "agent_b",
155
+ "sender_content": "AI will transform healthcare completely.",
156
+ "receiver_content": "Yes, medical AI is very promising.",
157
+ },
158
+ {
159
+ "sender_id": "agent_b",
160
+ "receiver_id": "agent_c",
161
+ "sender_content": "Healthcare AI needs careful regulation.",
162
+ "receiver_content": "Agreed, we need safety standards.",
163
+ },
164
+ ]
165
+
166
+ results = tracker.bulk_track(interactions)
167
+
168
+ for r in results:
169
+ print(f"{r['sender_id']} -> {r['receiver_id']}: IQx={r['IQx']}")
170
+ ```
171
+
172
+ ### Generate Summary Report
173
+
174
+ ```python
175
+ summary = tracker.summary(top_n=5)
176
+
177
+ print(f"Total Events: {summary.total_events}")
178
+ print(f"Top Influencers: {summary.top_influencers}")
179
+ print(f"Most Susceptible: {summary.top_susceptible}")
180
+ ```
181
+
182
+ ### Export Data
183
+
184
+ ```python
185
+ tracker.export_csv("influence_data.csv")
186
+ tracker.export_jsonl("influence_data.jsonl")
187
+ ```
188
+
189
+ ### Monitor Anomalies
190
+
191
+ ```python
192
+ # Get propagation risk
193
+ pr = tracker.get_propagation_risk()
194
+ if pr > 1.0:
195
+ print(f"Warning: PR={pr:.2f} - influence may amplify")
196
+
197
+ # Get anomaly alerts (only valid metrics, not cold-start)
198
+ alerts = tracker.get_alerts()
199
+ for alert in alerts:
200
+ print(f"Alert: Z={alert.Z_score:.2f}")
201
+ ```
202
+
203
+ ---
204
+
205
+ ## CLI Usage
206
+
207
+ ```bash
208
+ # Initialize a database
209
+ traceiq init --db analysis.db
210
+
211
+ # Ingest interactions from JSONL file
212
+ traceiq ingest interactions.jsonl --db analysis.db
213
+
214
+ # View summary report
215
+ traceiq summary --db analysis.db
216
+
217
+ # Export data
218
+ traceiq export --db analysis.db -o results.csv --format csv
219
+
220
+ # Generate plots
221
+ traceiq plot heatmap --db analysis.db -o heatmap.png
222
+ traceiq plot network --db analysis.db -o network.png
223
+
224
+ # IEEE Metrics Commands
225
+ traceiq propagation-risk --db analysis.db
226
+ traceiq alerts --db analysis.db --threshold 2.0
227
+ traceiq risky-agents --db analysis.db --top-n 10
228
+ ```
229
+
230
+ For full CLI reference, see [docs/cli.md](docs/cli.md).
231
+
232
+ ---
233
+
234
+ ## Visualizations
235
+
236
+ ```python
237
+ from traceiq.plotting import (
238
+ plot_influence_heatmap,
239
+ plot_top_influencers,
240
+ plot_influence_network,
241
+ plot_drift_over_time,
242
+ )
243
+
244
+ # Influence heatmap
245
+ plot_influence_heatmap(tracker.graph, output_path="heatmap.png")
246
+
247
+ # Top influencers bar chart
248
+ plot_top_influencers(tracker.graph, n=10, output_path="influencers.png")
249
+
250
+ # Network visualization
251
+ plot_influence_network(tracker.graph, output_path="network.png")
252
+ ```
253
+
254
+ ---
255
+
256
+ ## Research Testbed
257
+
258
+ TraceIQ includes reproducible experiments for studying AI-to-AI influence:
259
+
260
+ ```bash
261
+ pip install -e ".[research]"
262
+
263
+ # Run experiments
264
+ python experiments/run_exp1_wrong_hint.py # Wrong hint infection
265
+ python experiments/run_exp2_propagation.py # Multi-hop propagation
266
+ python experiments/run_exp3_mitigation.py # Mitigation policy
267
+
268
+ # Generate plots
269
+ python experiments/plot_all.py
270
+ ```
271
+
272
+ See [experiments/README.md](experiments/README.md) for details.
273
+
274
+ ---
275
+
276
+ ## Documentation
277
+
278
+ | Document | Description |
279
+ |----------|-------------|
280
+ | [docs/quickstart.md](docs/quickstart.md) | Getting started guide |
281
+ | [docs/metrics.md](docs/metrics.md) | Detailed metric documentation |
282
+ | [docs/configuration.md](docs/configuration.md) | Configuration reference |
283
+ | [docs/architecture.md](docs/architecture.md) | System architecture |
284
+ | [docs/integration.md](docs/integration.md) | Integration patterns |
285
+ | [docs/cli.md](docs/cli.md) | CLI reference |
286
+ | [docs/THEORY.md](docs/THEORY.md) | Mathematical foundations |
287
+ | [MATH.md](MATH.md) | IEEE metric formulas |
288
+
289
+ ---
290
+
291
+ ## Dependencies
292
+
293
+ **Core:**
294
+ - pydantic >= 2.0
295
+ - numpy >= 1.24
296
+ - networkx >= 3.0
297
+ - click >= 8.0
298
+ - rich >= 13.0
299
+
300
+ **Optional:**
301
+ - sentence-transformers >= 2.2 (`[embedding]`)
302
+ - matplotlib >= 3.7 (`[plot]`)
303
+ - pandas >= 2.0, scipy >= 1.10 (`[research]`)
304
+
305
+ ---
306
+
307
+ ## Development
308
+
309
+ ```bash
310
+ # Install dev dependencies
311
+ pip install -e ".[all,dev]"
312
+
313
+ # Run linter
314
+ ruff check src/ tests/
315
+
316
+ # Run tests
317
+ pytest -v
318
+
319
+ # Build documentation
320
+ pip install mkdocs mkdocs-material
321
+ mkdocs serve
322
+ ```
323
+
324
+ ---
325
+
326
+ ## License
327
+
328
+ MIT License - see [LICENSE](LICENSE) for details.
329
+
330
+ ## Contributing
331
+
332
+ Contributions are welcome! Please feel free to submit a Pull Request.
333
+
334
+ 1. Fork the repository
335
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
336
+ 3. Run tests (`pytest`)
337
+ 4. Run linter (`ruff check src/ tests/`)
338
+ 5. Commit your changes
339
+ 6. Push to the branch
340
+ 7. Open a Pull Request
341
+
342
+ ## Citation
343
+
344
+ If you use TraceIQ in your research, please cite:
345
+
346
+ ```bibtex
347
+ @software{traceiq,
348
+ title = {TraceIQ: Measure AI-to-AI Influence in Multi-Agent Systems},
349
+ year = {2024},
350
+ url = {https://github.com/Anarv2104/TraceIQ}
351
+ }
352
+ ```
353
+
354
+ ---
355
+
356
+ *Built for AI safety researchers and multi-agent system developers*