Thesis

This is the (unofficial) thesis I stumbled into for my computer science master's at Portland State University which ended up being about: authoring software history. The proposed method binds together two histories into a single narrative. Those histories are: 1. source code history (revisable) and 2. design decision history (immutable).

1. Problem Statement

1.1. AKM-centric

1.1.1. v1

The following is limited to application-level software architecture decisions (not system-level). [1], [2]
(1 application-level architecture decisions are often amenable to change)

Engineering discipline establishes rigorous, unambiguous decision criteria for specific scenarios. Such decisions are physically represented in the design itself: the cross-sectional area of a column, the path of a conductor, etc. However, software engineering decisions often:
  • have multiple acceptable trajectories
  • are intended to change in future circumstances

and thus are not natively represented by the medium of code. [3]

(2 in other engineering disciplines, decisions manifest physically) [4]
(3 software engineering decisions can be ambiguous) [1], [3]

Artifacts involved in a sequence of changes to an application often do not contain references to architecture decisions. [3], [5]

(4 software architecture decisions often not made explicit) [6]

Accessibility of previous & current architecture decisions is useful in:
  • on-boarding, understanding history & evolution of the code
  • refactoring, maintenance, code health
  • updates to & implementation of requirements, increasing complexity
  • maintaining engineering standards, enforcing practices
  • analyzing tradeoffs, future trajectories

[1], [2], [7], [8], [9]
(5 architecture decisions are useful)

Specifically, "accessibility" of decisions refers to attributes such as:
  • completeness, explainability, trustworthiness, quality
  • low cognitive load of human interface, ease of exploration, adaptability
  • modifiability, ease of maintenance, consistent value & relevance over time

[10]
(6 how might software architecture decisions be accessible)

To address this "architecture decision gap" in the software development life cycle we propose "structured decision records". [3], [5]
(7 how can we represent decisions in software)

1.1.2. v2

When software applications are architectured in dynamic, ill-defined environments: design decisions are often made with the intention of revision. [1, p. 2], [2, p. 1]

Yet, design records are rarely accessible and without understanding of previous and current design decisions, revisions in the software life cycle becomes increasingly expensive. [3, p. 1], [5, p. 2]

Unlike engineering disciplines for which static, well-defined environments lend to rigorously established decision criteria which are naturally manifested in a physical design artifact [4, p. 1]: software decision criteria is often ambiguous and continuously evolving (is stateful in nature) which is not naturally by software design artifacts (the code) which can only represent the current, single state. [1, p. 2], [3, p. 1]

These problems are exacerbated by:

1.1.3. v6

The process of creating & maintaining software architecture design records is tedious, expensive, sensitive to entropy, and resulting artifacts are of limited continued use. [7], [9, p. 2], [14, p. 4]

In environments of rapid change and uncertainty, decisions are made with the intention of revision. [1, p. 2], [2, p. 1] Yet, when previous design decisions are inaccessible (skipped, implicit, or lost) [3, p. 1], [5, p. 2], [6, p. 1] revisions become increasingly difficult and expensive. [7], [8, p. 3], [15, p. 20]

Agentic workflows simultaneously worsen the design "decision gap" while benefitting from context of previous decisions. [11, p. 5], [12, p. 10], [13, p. 3]

This paper aims to re-define architecture design records as active artifacts and a primary step in the software development life cycle.

1.1.4. v10

In environments of uncertainty and change, software architecture designs are decided with the intention of revision. [1], [2]

Yet, when knowledge of design decisions is incomplete, revisions become increasingly difficult and expensive to implement. [3], [5], [8], [15], [16], [17], [17]

Documentation of such decisions typically produces passive artifacts which are quickly outdated. [7], [9], [14]

Agentic workflows widen this "decision-implementation gap" while simultaneously benefitting from context of previous design decisions. [11], [12], [16], [18]

This paper aims to promote decisions to active artifacts in the software development life cycle which act as a foundation and primary step for generating a changeset.

1.1.5. v11

The day I die is the day I stop deciding.

Collective indecision may surpass corruption as the greatest enemy.

For the sake of this: I'll re-define "Indecision" is defined as:
  • inability to make timely decisions
    • can't take action; paralysis
  • action without quality decision
    • can take action, but long-term decision context is incomplete

[3], [6], [17]

Yet, environments of uncertainty and rapid change demand quality decision making ability. [1], [2]

Rapid change demands rapid change. Uncertainty demands maintaining context to analyze & revise decisions. [5], [7], [8], [9]

Modern software infrastructure enables rapid, incremental, measureable, revertable updates from an application's codebase. [19] Of course, long-term decision making ability is not to be solved… but, there is much help to be had in the process. Most help is to be had in software, where we can make decisions an active instrument in the continuous integration and deployment of a software application.

1.1.6. v12

Throughout the life cycle of a software application, many architectural decisions are made. [20]

These decisions are often made in rapidly changing and uncertain environments. [1]

Rapidly changing environments demand rapid updates to previous decisions. Modern software infrastructure enables methodical delivery of updates. [2], [19]

Uncertain environments, in addition to demanding quick responses, demand context of previous decisions. When you respond in an uncertain environment, you must, at the very least, know what you decided before. Lastly, uncertain environments demand quality decisions over long periods of time. Long-term decision quality remains requiring of hybrid intelligence. One should not generally rely on machine inference.

In practice, maintaining a close to context of prior architectural knowledge is rarely accomplished or at great expense. [5], [9], [21]

Architectural decisions and knowledge are subject to many forms of degradation. Incomplete Architectural Knowledge (AK) results in challenges which quickly compound. [22]

Maintaining AK is naturally an open-ended task, and additionally varies from organization to organization to individual project. Thus, it is an ill-defined task in terms of what is required, when it is done, and if it is done well.

Maintenance of AK is thus a continuously evolving definition & process — but this does not mean it is intractable. And so, in order to enforce maintenance of AK, a decision must be elevated to a first class artifact; ensuring maintenance of AK through time in response to a stimulus, a decision is the origin point of interaction with a codebase.

[20]

This AK-implementation gap is worsened by agentic workflows naively bolted onto existing software development processes. [11]

Agentic workflows may also be able to bridge the gap. [12]

Relative to code, AK is a secondary artifact. Yet, much literature about Architectural Knowledge Management (AKM) indicates that AK should be considered first-class artifacts. [3], [14], [23], [24], [25], [25]

Promoting AK to a first-class artifact is under-explored. [20]

1.1.7. v13

Throughout the life cycle of a software application, many architectural decisions are made. These decisions often occur in rapidly changing and uncertain environments. [1], [2]

Rapidly changing environments demand rapid updates to previous decisions. Modern software infrastructure enables methodical delivery of updates. [19]

Uncertain environments, in addition to demanding quick responses, demand context of previous decisions. In practice, maintaining a complete context of prior architectural knowledge is rarely accomplished or at great expense. [5], [9], [21]

Architectural knowledge is subject to many forms of degradation. Incomplete AK results in challenges which quickly compound. [20], [22]

This AK-implementation gap is worsened by agentic workflows naively bolted onto existing software development processes. [11]

Agentic workflows may also be able to bridge the gap. [12]

Creation and maintenance of AK is naturally an open-ended task: interpretations may vary between organizations and projects. Thus what is required, if it is quality, and when AK is complete does not have a clear definition. This makes a first-class representation difficult and why, relative to code, AK has remained a secondary artifact. Yet, much literature about AKM indicates that AK should be considered first-class artifacts. [3], [14], [23], [24], [25], [25]

Architectural knowledge lacks the infrastructure and tooling dedicated to code. Promoting AK to a first-class artifact to be operationalized by the core infrastructure and tooling (CI/CD) in a software development lifecycle is under-explored. [20]

1.2. Decision-centric

1.2.1. v1

Decisions are hard, we make a lot of them, we sometimes revise them (with irreversible consequences), and, crucially, they are of compounding importance over time.

Decisions are shaped by an environment. Yet, environments often develop aspects which negatively impact decision making. Avoiding these detrimental interactions requires new perspectives on the many facets of decisions.

Software engineering has a deep literature to aid us in making quality architecture decisions, documenting architectures effectively, and on.

Quality decision making benefits from such expert knowledge, but requires an intuition of a codebase's circumstances. As intuition weakens, decision making ability follows.

Intution is developed through the friction of work. When the work to generate code becomes frictionless, intuition for the architecture & implementation does not naturally develop.

To facilitate continued quality decisions, intuition for a codebase must be developed and maintained. Without the development of intuition through the authoring of code, friction must be added elsewhere in the software development life cycle.

1.2.2. v2

Decisions are hard, [26], [27] we make a lot of them, we sometimes revise them with irreversible consequences, and they are of compounding importance over time. [28], [28], [29], [30], [31]

Decisions are shaped by the environment in which they are made. [32], [33], [34], [35] When that environment degrades, so does the quality of the decisions it produces. [36], [37]

Software engineering has built a deep literature around this problem: how to make quality architecture decisions, and how to preserve the knowledge behind them. [20] That literature assumes a practitioner with hard-won intuition about their codebase - intuition developed through the friction of directly authoring it. [38], [38], [39], [39], [40]

When code generation becomes frictionless, that intuition does not naturally develop. The environment changes; decision quality follows. [41], [41], [42], [43]

The literature's tools remain valuable. But they were not designed for an environment in which the practitioner's intuition can no longer be assumed. [44], [45] Sustaining decision quality in such an environment requires deliberately reintroducing the friction that frictionless code generation removes. [46], [47]

1.2.3. v3

A software system can be thought of in terms of its form but equally of the underlying decisions. [3], [48] Those decisions shape architecture, tooling, constraints, interfaces, deployment strategies, and future change. Some decisions are revised quickly without much consequence. Others remain embedded for years. Their effects compound over time. [7], [28], [28], [49], [50]

Code is well supported by software infrastructure. It is versioned, tested, reviewed, deployed, and tracked through mature tooling. Decision state is not. The context behind important changes is often scattered across issue threads, diagrams, design notes, chat logs, and individual memory. [3], [51], [51] Put plainly: implementations are reliably preserved in a standardized manner, yet preservation of rationale may vary and only contains fragments. [3], [52]

This "decision-implementation" gap matters because software development depends not only on the ability to generate changes, but on the ability to make and revise decisions under changing conditions. [53] Those conditions are often poor: incomplete information, moving requirements, time constraints, shifting ownership, fatigue, and on. [2], [36], [37], [54] More recently, code generation has changed the relationship between implementation work and architectural intuition. [41], [41], [43] When implementation becomes easier to produce, the understanding once developed naturally through the direct friction of authoring and revising code no longer arises in the same way. [38], [39], [40], [45], [46]

1.2.4. v4

If only a software architect could bend time… to preserve past rationale by broadcasting into the future to those who need it. Best we can do is write our history and try hard to make it discoverable; the ideal of a perfect history is an illusion.

The question is not: did we capture the intent, traces, tickets, diagrams, ….
The question is: how can we interact with each decision in our architecture as it collides with reality? [cite: sw-arch-is-decisions]

History is not a mere linear timeline of events, yet we track our software evolution as a simple sequence. The events of software architecture's evolution form a topology of decisions. It is possible to build a model to represent this. Additionally, we can incorporate into topology the ability to define structural warning signals and other functions.

1.2.5. v5

The progression of codebase's lifecycle surfaces as a sequence of snapshots in time, yet underneath is a rich and complex structure of relationships between decisions past. From the surface one can read and parse a history, while below the surface interdependent decisions are a structure to be queried. Remediation to the codebase bubbles up as additional events occurred, yet each bubble may represent a reconsideration of entire branches of decisions. The surface-level history is calm, still, dead; below lives living, interlinked forests of decisions capable of sensing their collision with reality in the present. [25], [50], [55], [55], [56], [57], [58]

This does not imply replacing git, but building on top (or, to follow the analogy: below). Specifically, an event-sourced Command/Query layer which implements a "decision-gated" protocol in between snapshots. This mechanism links changes in decisions to changes in the code. Additionally, the decision event feed into a topological structure that is configurable, stateful, can be computed on, can define computations, can be inherited, and on. [25], [59]

1.2.6. v6

A simple sequence of changes (actions), <a1,..,an><a_1, .., a_n>, can mathematically define the states of a codebase's history. The decisions which accompany each change, however, embody a much richer space in terms of structure, relationships, and interactions.

You may imagine the top of an iceberg… you can see the shape exposed above the surface of the water, but that's it.

For a codebase, what's exposed above the surface is the latest state of the code (the sum of all actions). In git, this is referred to as the HEAD. git allows us to go back in time to see how the surface once was. From a back in time, it's easy to see the difference in states (the difference, or, the result of a sequence of actions).

However, when we try to look below (at the decisions), we can't see as clearly. We do our best to keep the docs up to date, write the Architecture Decision Records (ADRs), capture the traces, the specs, create diagrams, etc. This helps, but the clarity when we look below pales in comparison to the of the surface… Down below, there may even be shadows (stale or incorrect information) which we have to ignore in order to see the true shape. You'll most likely have to rely on your hard earned intuition or do some exploration.

Even more difficult: to look underneath and back in time! Wouldn't it be nice to immediately see the entire topology of decisions that once existed? Imagine if you could directly compare against the present decisions… a decision diff! What if we could go even further and know the circumstances of how those decisions came to be and even which lines of code they apply to?

The question I am asking is… in software, can we elevate "decisions" to elements of near equal citizenship as expressions in code? To achieve this, we can mathematically link changes in code to changes in decisions. These first class decisions may have a formal structure, topological relationships, computable warning signals, a stateful protocol, and on.

1.2.7. v7

When humans try to model, navigate, and ultimately affect reality through language, is “decision” a useful general-purpose primitive for organizing that work?

This paper explores whether a decision-first system can function as a general coordination substrate across domains

Such a system may serve not only as a record of decisions, actions, and commitments, but also as a navigable model of a decision space: its adjacent possibilities, trajectories, and contradictions within a domain.

This work sits at the intersection of design rationale, design space analysis, collaborative decision support, and decision provenance, but extends them toward a decision-first execution model in which decisions act as a general coordination substrate across domains.

1.2.8. v8

Machine learning of language has let one generate code at super-human speed while relaxing the necessary precision… the same assistance shadows, pollutes or erodes (union, not xor) the hard-earned & embodied : skills & decison-making intuition (2^2) that cultivate quality codebases, a threat this paper calls "decision mode collapse."

If a software system is most truthfully represented as the set of decisions behind it, then preserving decision quality and intuition across the SDLC requires first-class tooling for decisions themselves, not just the code (a rigorous projection).

This paper proposes a "decision environment" (denv) composed of:
  1. an event-sourced communication protocol,
  2. a graph data structure whose nodes enumerate scenarios (questions to be decided on) carrying an immutable progression of stances (decision choices), and
  3. accompanying tooling to manifest as a general interactive medium for organization and collaborative decision-making;
it traces: A. the idea's evolution from a random curiousity in a software engineering course into a master's thesis B. packages the result as a GitHub organization containing:
  1. core libraries
  2. a CLI
  3. a self-hostable image for real-time collaborative software development
  4. boilerplate repositories of decision environment examples (an enumeration of decision-space trajectories
  5. and an indempotent set of instructions for reverse-cultivating a decision environment from seeded commits

The contribution sits at the intersection of human-machine interaction, collaborative decision support systems, and software engineering principles, while aiming to generalize to any organization designing "forcing functions" to uphold quality decisions in any domain.

1.3. History-centric

1.3.1. v1

How might we tell a richer story of the progression of a codebase's lifecycle? Currently, we track the chronological history of the code from state to state. But, what of the underlying decisions which determined each state?

Version control systems such as git provide us with a chronological timeline of states of the code, and, by definition, the action (changeset) that occurred between each state. This project proposes interleaving (into that timeline of actions and states) an event-based protocol. The protocol's primary objective: a mathematical link between the decisions made prior to each action.

You may wonder: "Code is code… what is the representation for a decision?" That answer is: "It depends." It's configurable. The proposed protocol only enforces "how to carry decisions alongside actions", not "what decisions look like". Just as one may write poor code, one's code may link to poor underlying decisions.

A decision may be as minimal as (essentially, a Pull Request (PR)):
  • a scenario description
  • an action (changeset), and
  • a sign off from someone.

You may again wonder: "what's the point?"
While one could define a decision so minimally… at the other end of the spectrum, a decision object may act as a living substrate for all that software engineering has to offer: tradeoff matrices, plans & specs, ADRs, telemetry, and on.

The introduction of this "decision protocol" primarily enforces the formal "carrying of decisions" alongside our existing formal practices of carrying the state of our code. And, as we will see, opens up a new world of functionality for and ways to interact with our codebase. Lastly, in the face of isolating & frictionless methods of generating code, these first-class decisions can also act as collaborative Cognitive Forcing Functions (CFFs).

2. Abstract

We have principles for managing complexity; we can design our code well. But what about the design of the source code history itself? How important is a well structured history?

Our interactions with the world are immutable. Time goes on, history is written. Source history is revisable. Return to earlier and make a change.

When a revision to the source is needed, you and other participants interact. Your future interactions may revise an earlier source state. These two histories are on different timelines. Proposed is an approach for binding a unified history.

Software is susceptible to a runaway effect where continued work becomes increasingly slow, difficult, risky, or stops. While this can be prevented by good design and maintenance, this work considers the importance of a software's history.

Software… we are writing constantly. Softwares are shooting out of the printer, approaching light speed! The software's are combining together to make a giant ball! Now the ball's surface is growing… in weird directions… the surface is becoming extremely complex!

2.1. PNSQC g doc

2.1.1. Decision based

Abstract Over a software’s development life cycle (SDLC), many decisions carry responsibility for the source code over its history. Sustaining understanding of prior decisions is tedious and difficult. However, without clear decision awareness, naive modification is susceptible to a runaway effect, known as architectural erosion or compounding technical debt, where change becomes increasingly expensive, risky, unsafe, or blocked. When design rationale is preserved in passive artifacts with weak links to code, isolated changesets may drift. This paper instead models decisions as formally tangled with source code history through a “Decision Environment” composed of three connected spaces: (1) a source space combining versioned history with hierarchical source code artifacts; (2) a question-decision space (a directed acyclic graph, often tree-shaped); and (3) a programmable temporal observation space. The spaces respond in tandem to changing circumstances. Participants act within and observe the environment through a communication protocol. We present an event-based protocol, including core libraries, CLI/API/web tooling, integrations, explanation/annotation mechanisms, and workflows for interacting with the decision environment during regular development and onboarding established code bases. The protocol acts as a cognitive forcing function: links from changed lines to prior decisions act as an inertial resistance which requires changesets to be reconciled with the prior environment.

2.1.2. Questioning the Source History: Decisions and Revisions

Abstract Over a software’s lifecycle, the source history is cultivated within a field of questions and decisions. Sustaining understanding of our [design] decision history is not easy. However, repeated modification of software, without a clear history, is susceptible to a runaway effect where change becomes increasingly expensive, difficult, risky, unsafe, or eventually freezes (often: architectural erosion, compounding technical debt). When source history and design history are preserved in isolation, a changeset (a next step in source history) can drift, or become isolated, from the design. It is proposed to instead model these histories in tandem: the revisionist source code history, joined by, two immutable temporal histories: a question-decision history and a programmable observation history. The use of the proposed tandem history does not make drift impossible, only gives a structure of resistance against it by maintaining “responsibility” links from decision points to lines of code. Decisions can change, questions are still. Including questions in the model gives structure to the decision space. Participants interact within a “question-decision environment” via a protocol to read, write, and revise “chapters” of the tandem history. Proposed is an event-based protocol, including core libraries, CLI/API/GUI, explanations & annotations, integrations, extensibility, and tutorials for regular development and onboarding established code bases. Question the Source: A Tandem History

2.1.3. Question the Source: A Questionably Explainable History

Abstract Over a software’s lifecycle, the source code is cultivated within the field of questions and decisions. Sustaining understanding of our [design] decision history is not easy. However, without a clear history, software is susceptible to a runaway effect where change becomes increasingly slow, expensive, difficult, risky, unsafe, or eventually freezes. When source history and design history are recorded in isolation, new work can drift from the intended design. It is proposed to instead model these histories in tandem: a revisable, sequential source code history paired with an immutable, temporal question-decision history. Decisions can change, questions stay. Modeling questions gives an exploratory structure to the decision space. The proposed model acts as a forcing function: upfront effort is demanded in order to maintain relationships between decision history and source history, but, in turn, hunks of code are stabilized by an inertial resistance of linked prior decisions (preventing drift). Changes are reconciled with prior decision points before the tandem history can move to the next state. The model does not prevent bad code nor poor decisions; it only provides a method for authoring code and decision histories as one.

3. Introduction

3.1. v1

Application-level decisions in a SDLC are not "high-stakes" as in health or education domains. (Ignoring costs and assuming expertise) Decisions in software may be: implemented many ways, changed later, evaluated ahead of time, incrementally rolled out, automatically rolled back, etc.

Application-level decisions (not: multi-application system wide architecture & physical infrastructure) in a given project's SDLC involve choices and tradeoffs between common frameworks, architecture patterns, database integrations, etc. Popular application-level practices in popular languages are reasonably represented in Large Language Models (LLMs) [60] and implementation by agentic systems is reasonable with enforceable guardrails. [61], [61] However, decision making ability in such agentic workflows is lacking on many dimensions. [12], [12], [44], [44]

Current approaches for integrating agentic workflows into the SDLC augment existing practices. [13], [13] This paper also wonders about augmenting an existing workflow, namely, the ADR, however, the proposed method in the paper molds the ADR into a "structured decision" of which may be able to be adopted widely if it brings meaningful benefits to the SDLC in terms of maintainability, safety, engineering, ethics, trust, cognitive load, education, collaboration, and lastly, by establishing a comprehensive enumeration of software project starting points to be used by anyone (boilerplate repositories to be forked).

Previous approaches of documenting decisions in a codebase have been faced with tediousness, consistent team onboarding and alignment, enforcement difficulty, staleness, high cognitive load, low continual value, isolation, etc. [14], [14], [17], [17]

This paper attempts to mold the idea of the ADR into a set of structured files that lives alongside code and tests. While fundamentally different, these "structured decisions" share one similar aspect: much like lines of code may be covered by a test, many "structured decisions" may cover many lines of code and/or their tests. Do not be fooled: the "coverage" of a "structured decision" is much weaker (to the point that it should not be called coverage) in that it does not actually "cover" a line of code by actually interacting with, or, executing it, and to the further detriment of the definition of "cover", a "covering decision" must additionally manually maintain a one-way verifiable link from decision to code and/or test (a tedious, error-prone task). The creation and maintenance of these manual one-way relationships at least fits with the function of structured decisions: they are the pre-cursor to code and tests and so the creation of these one way relationships will be ahead of time and revised as each decision is made – to change the code you must first make a decision and it will be part of that decisions "plan" which files are interacted with. The difficult part is including all previously defined implicitly included decisions, but some deterministic and semantic rules can be made to ease this burden.

In the SDLC, these structured decisions are at the opposite end of the pull request, hence "PrePR". Structured decisions also function as: parents to multiple variations of plans and their changesets, definitions for reconsideration of a decision, an immutable history of the code evolution, an entry point for code exploration, and on.

5. Method

5.1. sMDP Lens

The Markov Decision Process (MDP) as a reference, is defined as: MDP=(S,A,P,R,γ)MDP = (S,A,P,R,\gamma). For a codebase, imagine:
  • each state, SS, as a commit on the main branch
  • an action, AA, is a changeset applied to reach a new state

The transition probability tensor, PP, doesn't apply to code - a valid changeset is always applied deterministically. The reward, RR, can also be ignored for now (although is potentially interesting to think about over long time horizons). The discount factor, γ\gamma, can also be ignored for now.

Playing off the MDP and incorporating our aforementioned "decisions", we have a semi-MDP, sMDP=(S,A,D)sMDP = (S,A,D).

It is then proposed that a base model for decisions, DD, might be question centered.

6. Results

7. Discussion

8. Conclusion

9. References

[1]
J. Tyree and A. Akerman, “Architecture decisions: Demystifying architecture,” Ieee software, vol. 22, no. 2, pp. 19–27, 2005, doi: 10.1109/MS.2005.27 (opens in a new tab).
[2]
S. Dasanayake, J. Markkula, S. Aaramaa, and M. Oivo, “Software architecture decision-making practices and challenges: An industrial case study,” in Proceedings of the 24th australasian software engineering conference (aswec 2015), IEEE, 2015, pp. 88–97. doi: 10.1109/ASWEC.2015.20 (opens in a new tab).
[3]
A. Jansen and J. Bosch, “Software architecture as a set of architectural design decisions,” in Proceedings of the 5th working ieee/ifip conference on software architecture (wicsa 2005), IEEE, 2005, pp. 109–119. doi: 10.1109/WICSA.2005.61 (opens in a new tab).
[4]
D. E. Perry and A. L. Wolf, “Foundations for the study of software architecture,” Acm sigsoft software engineering notes, vol. 17, no. 4, pp. 40–52, 1992, doi: 10.1145/141874.141884 (opens in a new tab).
[5]
P. Kruchten, P. Lago, H. van Vliet, and T. Wolf, “Building up and reasoning about architectural knowledge,” in Proceedings of the 2nd international workshop on the role of software architecture in testing and analysis (rosatea), 2004.
[6]
I. Qaisar, R. Jongeling, and J. Carlson, “State-of-practice in architectural change management for software-intensive systems: An interview study,” in 2025 Ieee 22nd international conference on software architecture companion (icsa-c), IEEE, 2025, pp. 434–441. doi: 10.1109/ICSA-C65153.2025.00067 (opens in a new tab).
[7]
D. L. Parnas, “Software aging,” in Proceedings of the 16th international conference on software engineering (icse 1994), IEEE, 1994, pp. 279–287. doi: 10.1109/ICSE.1994.296790 (opens in a new tab).
[8]
F. Tian, T. Wang, P. Liang, C. Wang, A. A. Khan, and M. A. Babar, “The impact of traceability on software maintenance and evolution: A mapping study,” Arxiv preprint arxiv:2108.02133, 2021, doi: 10.48550/arXiv.2108.02133 (opens in a new tab).
[9]
R. Capilla, A. Jansen, A. Tang, P. Avgeriou, and M. A. Babar, “10 Years of software architecture knowledge management: Practice and future,” Journal of systems and software, vol. 116, pp. 191–205, 2016, doi: 10.1016/j.jss.2015.08.054 (opens in a new tab).
[10]
P. Clements et al., Documenting software architectures: Views and beyond. Addison-Wesley, 2002.
[11]
A. Ahmad, M. Waseem, P. Liang, M. Fehmideh, M. S. Aktar, and T. Mikkonen, “Towards human-bot collaborative software architecting with chatgpt,” Arxiv preprint arxiv:2302.14600, 2023, doi: 10.48550/arXiv.2302.14600 (opens in a new tab).
[12]
J. He, C. Treude, and D. Lo, “Llm-based multi-agent systems for software engineering: Literature review, vision and the road ahead,” Acm transactions on software engineering and methodology, vol. 1, no. 1, 2025, doi: 10.1145/nnnnnnn.nnnnnnn (opens in a new tab).
[13]
R. Konda, “Agentic AI for software development: Autonomous agents in requirements engineering, testing, and deployment,” in International journal of emerging research in engineering and technology (aectic 2025 conference proceedings), 2025. doi: 10.63282/3050-922X.AECTIC-118 (opens in a new tab).
[14]
A. Forward and T. C. Lethbridge, “The relevance of software documentation, tools and technologies: A survey,” in Proceedings of the 2002 acm symposium on document engineering (doceng ’02), New York, NY, USA: ACM, 2002, pp. 26–33. doi: 10.1145/585058.585065 (opens in a new tab).
[15]
R. Li, P. Liang, M. Soliman, and P. Avgeriou, “Understanding software architecture erosion: A systematic mapping study,” Journal of software: Evolution and process, vol. 2022, p. e2423, 2022, doi: 10.1002/smr.2423 (opens in a new tab).
[16]
R. Dhar, A. Kakran, A. Karan, K. Vaidhyanathan, and V. Varma, “Draft-ing architectural design decisions using llms,” Arxiv preprint arxiv:2504.08207, 2025, doi: 10.48550/arXiv.2504.08207 (opens in a new tab).
[17]
B. Ahmeti, M. Linder, R. Groner, and R. Wohlrab, “Architecture decision records in practice: An action research study,” in Proceedings of the 18th european conference on software architecture (ecsa 2024), 2024.
[18]
R. Li et al., “MAAD: Automate software architecture design through knowledge-driven multi-agent collaboration,” Arxiv preprint arxiv:2507.21382, 2025, doi: 10.48550/arXiv.2507.21382 (opens in a new tab).
[19]
J. Humble and D. Farley, Continuous delivery: Reliable software releases through build, test, and deployment automation. Addison-Wesley, 2010.
[20]
D. Tofan, M. Galster, P. Avgeriou, and W. Schuitema, “Past and future of software architectural decisions – a systematic mapping study,” Information and software technology, vol. 56, no. 7, pp. 850–872, 2014, doi: 10.1016/j.infsof.2014.03.009 (opens in a new tab).
[21]
A. Gupta, D. Feitosa, R. Dhar, and K. Vaidhyanathan, “Context matters: Evaluating context strategies for automated ADR generation using LLMs,” Arxiv preprint arxiv:2604.03826, 2026, doi: 10.48550/arXiv.2604.03826 (opens in a new tab).
[22]
L. Hochstein and M. Lindvall, “Combating architectural degeneration: a survey,” Information and software technology, vol. 47, no. 10, pp. 643–656, 2005, doi: 10.1016/j.infsof.2004.11.005 (opens in a new tab).
[23]
G. Buchgeher, S. Schöberl, V. Geist, B. Dorninger, P. Haindl, and R. Weinreich, “Using architecture decision records in open source projects: An MSR study on GitHub,” Ieee access, vol. 11, pp. 63725–63740, 2023, doi: 10.1109/ACCESS.2023.3287654 (opens in a new tab).
[24]
A. Tang, P. Avgeriou, A. Jansen, R. Capilla, and M. A. Babar, “A comparative study of architecture knowledge management tools,” Journal of systems and software, vol. 83, no. 3, pp. 352–370, 2010, doi: 10.1016/j.jss.2009.08.032 (opens in a new tab).
[25]
U. van Heesch, P. Avgeriou, and R. Hilliard, “A documentation framework for architecture decisions,” Journal of systems and software, vol. 85, no. 4, pp. 795–820, 2012, doi: 10.1016/j.jss.2011.10.017 (opens in a new tab).
[26]
A. Tang, “Software designers, are you biased?,” in Proceedings of a workshop (author’s version), 2009.
[27]
D. Falessi, G. Cantone, R. Kazman, and P. Kruchten, “Decision-making techniques for software architecture design: A comparative survey,” Acm computing surveys, vol. 43, no. 4, pp. 1–28, 2011, doi: 10.1145/1978802.1978812 (opens in a new tab).
[28]
B. M. O’Reilly, “The machine in the ghost: Autonomy, hyperconnectivity, and residual causality,” Philosophies, vol. 6, no. 4, p. 81, 2021, doi: 10.3390/philosophies6040081 (opens in a new tab).
[29]
D. A. Tamburri, P. Kruchten, P. Lago, and H. van Vliet, “Social debt in software engineering: Insights from industry,” Journal of internet services and applications, vol. 6, no. 1, 2015, doi: 10.1186/s13174-015-0024-6 (opens in a new tab).
[30]
R. Bahsoon and W. Emmerich, “Evaluating software architectures for stability: A real options approach,” 2003.
[31]
K. Sullivan, P. Chalasani, S. Jha, and V. Sazawal, “Software design as an investment activity: A real options perspective,” 1999.
[32]
H. A. Simon, “Rational choice and the structure of the environment,” Psychological review, vol. 63, no. 2, pp. 129–138, 1956, doi: 10.1037/h0042769 (opens in a new tab).
[33]
H. A. Simon, “Invariants of human behavior,” Annual review of psychology, vol. 41, no. 1, pp. 1–20, 1990, doi: 10.1146/annurev.ps.41.020190.000245 (opens in a new tab).
[34]
P. M. Todd and G. Gigerenzer, Ecological rationality: Intelligence in the world. New York: Oxford University Press, 2012.
[35]
G. Gigerenzer, “Moral satisficing: Rethinking moral behavior as bounded rationality,” Topics in cognitive science, vol. 2, no. 3, pp. 528–554, 2010, doi: 10.1111/j.1756-8765.2010.01094.x (opens in a new tab).
[36]
G. A. Pignatiello, R. J. Martin, and R. L. Hickman, “Decision fatigue: A conceptual analysis,” Journal of health psychology, vol. 25, no. 1, pp. 123–135, 2018, doi: 10.1177/1359105318763510 (opens in a new tab).
[37]
S. Sarkar and C. Parnin, “Characterizing and predicting mental fatigue during programming tasks,” in 2017 Ieee/acm 2nd international workshop on emotion awareness in software engineering (semotion), IEEE, 2017. doi: 10.1109/semotion.2017.2 (opens in a new tab).
[38]
C. Pretorius, M. Razavian, K. Eling, and F. Langerak, “When rationality meets intuition: A research agenda for software design decision-making,” Journal of software: Evolution and process, vol. 36, no. 9, 2024, doi: 10.1002/smr.2664 (opens in a new tab).
[39]
R. M. Shiffrin and W. Schneider, “Controlled and automatic human information processing: I. detection, search, and attention,” Psychological review, vol. 84, no. 1, pp. 1–66, 1977.
[40]
J. Sweller, J. J. G. van Merriënboer, and F. G. W. C. Paas, “Cognitive architecture and instructional design,” Educational psychology review, vol. 10, no. 3, pp. 251–296, 1998.
[41]
G. Liu, B. Christian, T. Dumbalska, M. A. Bakker, and R. Dubey, “AI assistance reduces persistence and hurts independent performance,” Arxiv preprint arxiv:2604.04721, 2026, doi: 10.48550/arXiv.2604.04721 (opens in a new tab).
[42]
Shalu, N. Verma, K. Dev, A. B. Bhardwaj, and K. Kumar, “The cognitive cost of AI: How AI anxiety and attitudes influence decision fatigue in daily technology use,” Annals of neurosciences, vol. 33, no. 1, pp. 73–84, 2025, doi: 10.1177/09727531251359872 (opens in a new tab).
[43]
F. Dell’Acqua et al., “Navigating the jagged technological frontier: Field experimental evidence of the effects of artificial intelligence on knowledge worker productivity and quality,” Organization science, vol. 37, no. 2, pp. 403–423, 2026, doi: 10.1287/orsc.2025.21838 (opens in a new tab).
[44]
J. Ivers and I. Ozkaya, “Will generative ai fill the automation gap in software architecting?,” in 2025 Ieee 22nd international conference on software architecture companion (icsa-c), IEEE, 2025, pp. 41–48. doi: 10.1109/ICSA-C65153.2025.00014 (opens in a new tab).
[45]
L. Bainbridge, “Ironies of automation,” Automatica, vol. 19, no. 6, pp. 775–779, 1983, doi: 10.1016/0005-1098(83)90046-8 (opens in a new tab).
[46]
R. A. Bjork and E. L. Bjork, “Desirable difficulties in theory and practice,” Journal of applied research in memory and cognition, vol. 9, no. 4, pp. 475–479, 2020, doi: 10.1016/j.jarmac.2020.09.003 (opens in a new tab).
[47]
H. Westerbeek, “How ai is rewiring the human brain: the generational transformation of cognition and knowing,” Ai & society, 2026, doi: 10.1007/s00146-026-02912-2 (opens in a new tab).
[48]
H. van Vliet and A. Tang, “Decision making in software architecture,” Journal of systems and software, vol. 117, pp. 638–644, 2016.
[49]
M. Fowler, “Design stamina hypothesis.” Accessed: Apr. 15, 2026. [Online]. Available: https://martinfowler.com/bliki/DesignStaminaHypothesis.html (opens in a new tab)
[50]
D. Tofan, M. Galster, and P. Avgeriou, “Reducing architectural knowledge vaporization by applying the repertory grid technique,” Arxiv preprint, 2011, doi: 10.1007/978-3-642-23798-0_27 (opens in a new tab).
[51]
D. Tofan, M. Galster, and P. Avgeriou, “Improving architectural knowledge management in public sector organizations – an interview study,” in Proceedings of the 25th international conference on software engineering and knowledge engineering (seke 2013), 2013.
[52]
D. Falessi, M. Becker, and G. Cantone, “Design decision rationale: Experiences and steps ahead towards systematic use,” Acm sigsoft software engineering notes, vol. 31, no. 5, p. 2, 2006, doi: 10.1145/1163514.1178642 (opens in a new tab).
[53]
G. Hohpe, I. Ozkaya, U. Zdun, and O. Zimmermann, “The software architect’s role in the digital age,” Ieee software, vol. 33, no. 6, pp. 30–39, 2016, doi: 10.1109/MS.2016.137 (opens in a new tab).
[54]
D. A. Moore and E. R. Tenney, “Time pressure, performance, and productivity,” in Looking back, moving forward: A review of group and team-based research, vol. 15, E. A. Mannix, M. A. Neale, and J. R. Overbeck, Eds., Emerald, 2012.
[55]
R. Capilla, F. Nava, and J. C. Dueñas, “Modeling and documenting the evolution of architectural design decisions,” in Proceedings of the 2nd workshop on sharing and reusing architectural knowledge - architecture, rationale, and design intent (shark-adi 2007), IEEE Computer Society, 2007, pp. 9–15.
[56]
D. Tofan, “Tacit architectural knowledge,” in Proceedings of the 4th european conference on software architecture (ecsa 2010), Copenhagen, Denmark: ACM, 2010, pp. 9–11.
[57]
R. L. Krikhaar, “Software architecture reconstruction,” Universiteit van Amsterdam, 1999.
[58]
B. F. Antognolli and F. Petrillo, “Proof of concept as a first-class architectural decision instrument,” Arxiv preprint arxiv:2604.05835, 2026, doi: 10.48550/arXiv.2604.05835 (opens in a new tab).
[59]
H. A. Simon, “The architecture of complexity,” Proceedings of the american philosophical society, vol. 106, no. 6, pp. 467–482, 1962.
[60]
R. Dhar, K. Vaidhyanathan, and V. Varma, “Can llms generate architectural design decisions? an exploratory empirical study,” Arxiv preprint arxiv:2403.01709, 2024, doi: 10.48550/arXiv.2403.01709 (opens in a new tab).
[61]
J. Kim, “Harness engineering: A governance framework for AI-driven software engineering,” Ssrn preprint, 2026.
[62]
R. M. Batista and T. L. Griffiths, “A rational analysis of the effects of sycophantic ai,” Arxiv preprint arxiv:2602.14270, 2026, doi: 10.48550/arXiv.2602.14270 (opens in a new tab).
[63]
M. S. S. Samu, N. Khan, K. T. Elahi, T. B. Rahman, M. R. Islam, and F. Sadeque, “Ai as teammate or tool? a review of human–ai interaction in decision support,” Arxiv preprint arxiv:2602.15865, 2026, doi: 10.48550/arXiv.2602.15865 (opens in a new tab).

10. Acronyms

AKM Architectural Knowledge Management 1, 2

AK Architectural Knowledge 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16

AI Artificial Intelligence 1, 2

ADR Architecture Decision Record 1, 2, 3, 4, 5

CFF Cognitive Forcing Function 1

HAI Human-AI Interaction 1, 2

LLM Large Language Model 1, 2, 3, 4

MDP Markov Decision Process 1, 2, 3

MAS Multi-Agent System 1

PR Pull Request 1

RLHF Reinforcement Learning from Human Feedback 1

11. Glossary

Cognitive forcing function somethin' that makes you think 1