backlog

package
v0.13.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 5, 2026 License: MIT Imports: 16 Imported by: 0

Documentation

Overview

Package backlog decides what becomes of a role's acts on a project's issues (docs/spec/backlog-acts.md): each is checked against the code and the forge, then done, proposed to a person, or dropped. Closing is the first act built.

Index

Constants

View Source
const (
	Cautious     = "cautious"
	Normal       = "normal"
	Enterprising = "enterprising"
)

The autonomy levels, from the least to the most the role does alone.

View Source
const (
	FromLevel   = "level"   // the autonomy level's preset
	FromSetting = "setting" // the project set this kind itself
	FromDemoted = "demoted" // a person undid one of its acts: proposed until a tick sets it back
)

Where a kind's mode comes from, as the task and the report say it.

View Source
const (
	SuggestAfter  = 10
	SuggestTicked = 80
)

SuggestAfter is the proposals a person settled at a level before the report suggests another; SuggestTicked, the share ticked, in percent, past which a cautious role is told it could do more alone.

View Source
const (
	Act     = "act"
	Propose = "propose"
	Off     = "off"
)

Modes of an act.

View Source
const (
	LabelToRefine = "workline:to-refine"
	LabelDraft    = "workline:draft"    // the role drafted its Need or Validation
	LabelAccepted = "workline:accepted" // a person accepted the drafts: only who may triage sets a label
	LabelReady    = "workline:ready"
)

The labels of an issue on its way to ready (docs/spec/routing.md).

View Source
const (
	KeyResume = "resume"
	KeyAct    = "act/"
)

KeyResume is the box that resumes a paused role; KeyAct, followed by a kind of act, the box that sets that kind back to act.

View Source
const (
	Opened     = "opened"      // a new issue
	StillOpen  = "open"        // an open issue holds the subject: nothing written
	Settled    = "settled"     // closed as not planned or as a duplicate: a person's no, nothing written
	FoundAgain = "found-again" // closed otherwise, the subject found again: said once on it, not reopened
	Capped     = "capped"      // new, past the run's cap: not opened, found again at a later run
)

Outcomes of an opening.

View Source
const AgreeWord = "agreed"

AgreeWord is the reply that agrees to a text proposed to a reporter: its first line, case, spaces and a final "." or "!" aside (ADR-0021).

View Source
const IgnoredRunsMax = 20

IgnoredRunsMax bounds `ignored-runs-max`; 0 never pauses.

View Source
const JudgeKeyPrefix = "obsolete-"

JudgeKeyPrefix names the folder of a judge's question on an announced issue, its number after it: in/judge/obsolete-12/.

View Source
const JudgeQuestion = "" /* 244-byte string literal not displayed */

JudgeQuestion is what the second judge is asked of an announced issue.

View Source
const Keeper = "product-owner"

Keeper is the role whose state comment an opened issue is given: the product owner reads it from its next run, as any other issue.

View Source
const LabelObsolete = "workline:obsolete"

LabelObsolete marks an issue announced as obsolete: taking it off keeps the issue open.

View Source
const LabelTriage = "needs-triage"

LabelTriage marks an issue a role opened on a finding of its own, until a person or the product owner takes it (ADR-0018, "Opening issues, for every role").

View Source
const Levels = 4

Levels are the priorities an issue takes: 1, the most pressing, to 4 (docs/spec/backlog-acts.md, "Ordering").

View Source
const ObsoleteDays = 7

ObsoleteDays is how long an announcement waits, in days, when the role's settings do not say.

View Source
const PriorityPrefix = "workline:priority/"

PriorityPrefix starts each priority label: workline:priority/1 to /4.

View Source
const SubIssuesHeading = "## Sub-issues"

SubIssuesHeading heads the task list of a parent's children, on a forge without sub-issues.

Variables

View Source
var ActKinds = []string{"sources", "close-duplicate", "close-obsolete", "milestone", "order", "refine", "ready", "ask", "split", "rename", "open"}

ActKinds are the kinds of act as the settings name them, in the order the task and the report list them.

View Source
var AutonomyLevels = []string{Cautious, Normal, Enterprising}

AutonomyLevels are the autonomy levels a project may pick.

View Source
var DefaultExempt = []string{"pinned", "security"}

DefaultExempt are the labels that keep an issue from being announced obsolete, when the role's settings do not say.

View Source
var DraftMarker = forge.Marker("draft")

DraftMarker marks a section the role drafted and no person made theirs.

View Source
var Kinds = []string{"open", "close", "keep", "sources", "milestone", "order", "refine", "ready", "ask", "split", "rename"}

Kinds are the intentions that are acts on the backlog.

View Source
var Sections = []string{"Need", "Verification", "Validation", "Scope"}

Sections are an issue's, in the order they are written.

Functions

func Accepted added in v0.7.0

func Accepted(is forge.Issue) bool

Accepted says whether a person accepted an issue's drafts, by its label — read on the issue, never taken from a proposal.

func Agreement added in v0.11.0

func Agreement(notes []forge.Note, is forge.Issue, role string) string

Agreement is who agreed, in a reply, to the text last proposed to an issue's reporter (ADR-0021): after the last round, that round a proposal, the last comment of the reporter or of a person of the project — never a bot's, nor someone's the forge does not name — has AgreeWord as its first line. "" when there is none.

func AnnounceMarker added in v0.12.0

func AnnounceMarker(role string) string

AnnounceMarker marks the comment announcing an issue obsolete.

func AnnouncementComment added in v0.12.0

func AnnouncementComment(author string, c Proposal, role string, a Announcement, days int) string

AnnouncementComment is the comment announcing an issue obsolete: to its reporter and its watchers, why, the code quoted, from when it may be closed and how to keep it open; then the block the engine reads back.

func Ask added in v0.6.0

func Ask(author, questions string, round int) string

Ask is the comment asking the reporter what is missing; a later round says it follows their answer.

func AskMarker added in v0.6.0

func AskMarker(role string, round int) string

AskMarker marks the comment asking an issue's reporter: the first round's as it always was, a later one's with its round.

func Before added in v0.8.0

func Before(is forge.Issue) string

Before says an issue's place in the order, to put it back: its priority and its milestone.

func BodyDigest added in v0.6.0

func BodyDigest(body string) string

BodyDigest is what the state keeps of a body, to tell when a person changed it.

func CappedByRole added in v0.7.1

func CappedByRole(f forge.Backlog, role string, open []forge.Issue) []int

CappedByRole lists the issues an act was proposed on only because a run's cap was reached: they are read again, though nothing changed on them.

func ChildBody added in v0.11.0

func ChildBody(parent int, ch Child, role string) string

ChildBody is a split's child's body: a line naming its parent, then its four sections, Need and Validation as drafts.

func ClosedByRole

func ClosedByRole(f forge.Backlog, role string, open []forge.Issue) []int

ClosedByRole lists the issues the role's record says it closed, read from its report issue's comments; nil when there is none or it does not read.

func ClosingComment added in v0.12.0

func ClosingComment(c Proposal, role string) string

ClosingComment is what an obsolete issue is told as it is closed after its announcement.

func CodeKey added in v0.10.0

func CodeKey(path, line string) string

CodeKey is the subject of a finding on a line of code: its file and the line as it reads, spaces aside. Two roles finding the same line get the same key; the line changed, it is another subject.

func Comment

func Comment(c Proposal, role string) string

Comment is what the closed issue is told.

func CompareMilestones added in v0.8.0

func CompareMilestones(a, b string) int

CompareMilestones orders two milestone titles as versions: their numbers compared as numbers (v1.9 before v1.10), the rest as text.

func DraftLine added in v0.6.0

func DraftLine(role string) string

DraftLine opens a drafted section; deleting it makes the section a person's.

func EngineMarker added in v0.11.0

func EngineMarker(comment string) (string, bool)

EngineMarker says whether the engine wrote a comment, and its marker: the engine ends each of its comments with one; a person quoting one holds it inside, and is a person's all the same.

func ExemptLabel added in v0.12.0

func ExemptLabel(is forge.Issue, s Setting) string

ExemptLabel is the first of an issue's labels that keeps it from being announced or closed as obsolete, or "".

func FormatRecord

func FormatRecord(r Record) string

FormatRecord is the body of the report's record comment.

func FormatState

func FormatState(s State) string

FormatState is the body of an issue's state comment, its marker left to the forge's Sticky.

func ImportKey

func ImportKey(q Quote) string

ImportKey is the marker key of an issue opened from a file's text: the file and a digest of the text, so the same text is never opened twice.

func JudgeMaterial added in v0.12.0

func JudgeMaterial(repo string, is forge.Issue, a Announcement, code string) string

JudgeMaterial is what the second judge reads: the issue, the announcement's evidence, and the code quoted as it is now.

func KeptComment added in v0.12.0

func KeptComment(why string) string

KeptComment tells an announced issue why it stays open, when no person kept it.

func KeptMarker added in v0.12.0

func KeptMarker(role string) string

KeptMarker marks the comment saying why an announced issue stays open.

func Less added in v0.8.0

func Less(a, b forge.Issue) bool

Less is the backlog's order (docs/spec/backlog-acts.md, "Ordering"): the nearest milestone first, an issue in none after every one in one; then the priority, an issue with none after priority 4; then the lowest number.

func ListChildren added in v0.11.0

func ListChildren(body string, ids []int) string

ListChildren is a parent's body with its children as a task list under SubIssuesHeading: added after its text, or the list already there rewritten.

func Locate

func Locate(repo, path, text string) (from, to int, original string, ok bool)

Locate finds a quote in a file, as written but for spaces: the lines it spans, from 1, and those lines as the file has them.

func ModesLine added in v0.13.0

func ModesLine(modes []KindMode) string

ModesLine says every kind's mode on one line, for the report.

func MovedPercent added in v0.8.0

func MovedPercent(settings map[string]any) int

MovedPercent reads the role's `moved-percent-max` setting: the share of the open issues a run may move, in percent; a fifth when it is not set.

func NextMilestone added in v0.8.0

func NextMilestone(repo string, open []string) string

NextMilestone is the nearest open milestone not released, in version order; "" when there is none.

func NotReady added in v0.6.0

func NotReady(body string, accepted bool) []string

NotReady says what keeps an issue's body from ready: a section missing or empty, Need or Validation still a draft no person accepted.

func ObsoleteKey added in v0.12.0

func ObsoleteKey(q Quote) string

ObsoleteKey names a quote's evidence: its file or issue, and a digest of its text, spaces aside.

func OpenedBy added in v0.10.0

func OpenedBy(body string) string

OpenedBy is the role that opened an issue on a finding of its own through Openings, or "".

func Order added in v0.8.0

func Order(issues []forge.Issue)

Order sorts issues in the backlog's order.

func PeopleComments

func PeopleComments(comments []string) int

PeopleComments counts an issue's comments that are not the engine's.

func Priority added in v0.8.0

func Priority(is forge.Issue) int

Priority is an issue's level, the most pressing of its labels; 0 when it has none.

func PriorityLabel added in v0.8.0

func PriorityLabel(n int) string

PriorityLabel is the label of a priority level.

func PriorityLabels added in v0.8.0

func PriorityLabels(is forge.Issue) []int

PriorityLabels lists the levels an issue's priority labels give, in the order of its labels; more than one is a person's doing.

func ProposalComment added in v0.11.0

func ProposalComment(author string, c Proposal, role string) string

ProposalComment is the comment proposing an outsider's issue refined: what the role understood, its sections as it would write them, what it needs, and how to agree. Nothing is written in the body before (ADR-0021). The sections are kept in a YAML block, read back when it is agreed to.

func ProposalMarker added in v0.11.0

func ProposalMarker(role string, round int) string

ProposalMarker marks the comment proposing an outsider's issue refined.

func RecordMarker

func RecordMarker(role string) string

RecordMarker marks the report's comment holding what the role did.

func Refine added in v0.6.0

func Refine(body string, c Proposal, role string) (string, []string, []string)

Refine is an issue's body with the sections it lacks written: one there but empty (an issue form's "_No response_") filled in place, one missing added after the text, which stays as it is; added and kept name the sections written and those already there, left alone.

func Released added in v0.8.0

func Released(repo, milestone string) bool

Released says whether a tag named after the milestone exists: the release it was for is out.

func ReportTitle

func ReportTitle(role string) string

ReportTitle is the title of the role's report issue.

func Round added in v0.11.0

func Round(comment, role string) bool

Round says whether a comment is one of the engine's rounds with an issue's reporter: an ask or a proposal.

func RoundsMax added in v0.11.0

func RoundsMax(settings map[string]Setting) int

RoundsMax is how many times an issue's reporter is written to — asked, or proposed a refined text — before a person takes it: acts.ask.rounds, three when it is not set (ADR-0021).

func Settings

func Settings(settings map[string]any) map[string]Setting

Settings reads the role's `acts` setting.

func SplitKey added in v0.11.0

func SplitKey(parent int, title string) string

SplitKey is the marker key of a split's child: its parent and its title, so a split run again finds the children it opened.

func StateMarker

func StateMarker(role string) string

StateMarker marks the comment holding an issue's state.

func StripDrafts added in v0.7.0

func StripDrafts(body string) string

StripDrafts takes the draft lines out of a body: the drafts are a person's once accepted.

func TickMarker added in v0.12.0

func TickMarker(key string) string

TickMarker is the hidden key that ends a line of the report a person may tick.

func TitleKey added in v0.10.0

func TitleKey(title string) string

TitleKey is the subject of a finding that names no code: its title, spaces and case aside.

Types

type Announcement added in v0.12.0

type Announcement struct {
	Quote     Quote  `yaml:"quote"`
	Why       string `yaml:"why"`
	Commit    string `yaml:"commit"`
	Announced string `yaml:"announced"`    // the day it was announced, YYYY-MM-DD
	By        string `yaml:"by,omitempty"` // the model that proposed it
}

Announcement is what the engine wrote when it announced an issue obsolete, read back from its comment's block.

func LastAnnouncement added in v0.12.0

func LastAnnouncement(notes []forge.Note, role string) (*Announcement, []forge.Note)

LastAnnouncement reads the last announcement on an issue, and the notes written after it; nil when there is none, or it does not read.

func (Announcement) Key added in v0.12.0

func (a Announcement) Key() string

Key is the evidence an announcement rests on: kept open once, not announced again for it.

type Child added in v0.11.0

type Child struct {
	Title        string   `yaml:"title"`
	Need         string   `yaml:"need"`
	Verification string   `yaml:"verification"`
	Validation   string   `yaml:"validation"`
	Scope        string   `yaml:"scope"`
	Sources      []string `yaml:"sources,omitempty"`
}

Child is one part of a split need: an issue of its own, with its four sections (ADR-0022).

type Closing

type Closing struct {
	Issue int    `yaml:"issue"`
	Act   string `yaml:"act"`
	Level string `yaml:"level,omitempty"` // the autonomy level it was done at
}

Closing is one issue the role closed.

type Config added in v0.13.0

type Config struct {
	Level        string             // cautious, normal or enterprising
	Acts         map[string]Setting // each kind's mode and cap, the project's laid over the level's
	Origins      map[string]string  // each kind's: level or setting
	MovedPercent int                // the share of the open issues a run moves
	IgnoredMax   int                // runs nobody answered before the role pauses; 0 never
}

Config is how far the role goes in a run, read from its settings.

func ReadConfig added in v0.13.0

func ReadConfig(settings map[string]any) (Config, error)

ReadConfig reads the role's settings: the level, the acts, the moved share and the runs before a pause. A level or a number out of range is an error, never read as a default (principle 12).

func (Config) Modes added in v0.13.0

func (c Config) Modes(demoted []string) []KindMode

Modes lists each kind of act's mode, the kinds demoted proposed whatever the level or the setting.

type Decision

type Decision struct {
	Index  int      `yaml:"index"` // the intention's place in the run
	Mode   string   `yaml:"mode"`  // act, propose, or off (dropped)
	Act    Proposal `yaml:"act"`
	Capped bool     `yaml:"capped,omitempty"` // proposed only for the cap
}

Decision is what becomes of one act.

type Done added in v0.13.0

type Done struct {
	Issue int    `yaml:"issue"`
	Act   string `yaml:"act"`
	Was   string `yaml:"was,omitempty"`
	Set   string `yaml:"set,omitempty"`
	Level string `yaml:"level,omitempty"` // the autonomy level it was done at
}

Done is one act of the role's a person may undo: its issue, its kind, the value it had and the value the role set.

type Exchange added in v0.11.0

type Exchange struct {
	Rounds   int      // the engine's comments to the reporter
	Answered bool     // a person's comment after the last of them
	Asked    []string // each one's text, its marker left out
}

Exchange is the conversation with an issue's reporter, read from its comments: the engine's asks and proposals, in order, and whether a person wrote after the last one.

func ReadExchange added in v0.11.0

func ReadExchange(comments []string, role string) Exchange

ReadExchange reads the conversation with an issue's reporter.

type Hand added in v0.12.0

type Hand struct {
	Report   int
	Record   Record
	Broken   error    // the record does not read
	Ticks    []TickBy // the boxes ticked in the report's body now
	Comments int      // comments of people of the project on the report
	Signs    []string // what a person did since the last run: a tick, a comment, a closing or an act undone, a proposal settled
	// Undone are the role's acts a person undid since the last run, other
	// than closings; Standing, those still watched (ADR-0026).
	Undone   []Undo
	Standing []Done
}

Hand is what people did on the report since the last run.

func ReadHand added in v0.12.0

func ReadHand(f forge.Backlog, role string, open []forge.Issue) (*Hand, error)

ReadHand reads the report: its record, the boxes ticked in its body with who ticked them, the people's comments on it, and the signs of a person since the last run. No report: an empty hand.

func (*Hand) Demoted added in v0.13.0

func (h *Hand) Demoted(open []forge.Issue) []string

Demoted are the kinds of act back to propose: those the record holds, and those a person undid since the last run, a closing reopened or another act.

func (*Hand) Paused added in v0.12.0

func (h *Hand) Paused(max int) bool

Paused says whether the role pauses: max runs in a row nobody answered (ignored-runs-max; 0 never pauses), and no person's hand since.

func (*Hand) Tick added in v0.12.0

func (h *Hand) Tick(key string) (TickBy, bool)

Tick is the box ticked with that key, if any.

func (*Hand) Ticked added in v0.12.0

func (h *Hand) Ticked() []Pending

Ticked is a proposal a person of the project ticked, the engine able to do it: what pre gives the run, applied as the proposal recorded says.

type Judged added in v0.12.0

type Judged struct {
	Yes    *bool  `yaml:"yes"`
	Why    string `yaml:"why"`
	Model  string `yaml:"model"`
	Level  string `yaml:"level"`
	Author string `yaml:"author"`
	Error  string `yaml:"error"`
}

Judged is a second judge's answer on an announced issue (ADR-0005), written by the engine beside the question pre asked.

func (Judged) Says added in v0.12.0

func (j Judged) Says() string

Says is the judge's answer as a line: yes or no, why, and how far it stood from the model that proposed it.

type KindMode added in v0.13.0

type KindMode struct {
	Kind   string
	Mode   string
	Max    int
	Drafts string // refine: Need and Validation proposed when "propose"
	Origin string
}

KindMode is one kind of act's mode in a run, and where it comes from.

func (KindMode) Say added in v0.13.0

func (m KindMode) Say() string

Say says one kind's mode in a few words: "act, 5 a run (level)".

type Measure added in v0.13.0

type Measure struct {
	Level  string `yaml:"level"`
	Ticked int    `yaml:"ticked,omitempty"` // proposals a person of the project ticked: done as proposed
	Other  int    `yaml:"other,omitempty"`  // proposals settled otherwise: their issue closed, or opened by hand
}

Measure is what a person did with the proposals at the level in force: the report suggests another level from it, never changes the setting.

func (*Measure) Suggest added in v0.13.0

func (m *Measure) Suggest() (string, string)

Suggest is the level the report suggests, and why; "" when none.

type Obsolete added in v0.12.0

type Obsolete struct {
	Announcement *Announcement // nil: none waiting
	Due          bool          // its delay passed, nothing cancels it: a judge decides
	From         string        // the day it may be closed from
	Keep         string        // why it is kept open, when it is
	Say          bool          // the issue is told why it is kept: no person did it
}

Obsolete is where an issue's announcement stands.

func ReadObsolete added in v0.12.0

func ReadObsolete(repo string, is forge.Issue, notes []forge.Note, st *State, role string, s Setting, now time.Time) Obsolete

ReadObsolete says where an issue's announcement stands: none waiting (none, or settled already — its evidence in the state's kept), kept open (someone wrote, the label taken off, an exempt label, the code quoted gone), waiting for its day, or due for the judge.

type Opening added in v0.10.0

type Opening struct {
	Role    string   // the role that found it, named in the issue
	Key     string   // the marker's key: issue=<subject>, or import=<a file's text>
	Also    []string // older keys the same subject was opened under
	Title   string
	Body    string
	From    string   // where it was opened from, said after "Opened": " from `ROADMAP.md`"
	Sources []string // the code it is about, for the keeper's state
	Commit  string   // the commit it was seen at
	Triage  bool     // a role's finding: labelled needs-triage, capped, said once when found after it was closed
}

Opening is a subject a role opens an issue for.

type Openings added in v0.10.0

type Openings struct {
	Max int // a run's findings opened as issues, at most; the rest Capped
	// contains filtered or unexported fields
}

Openings is the one way every role opens an issue (ADR-0018): a stable key per subject, hidden in the issue's body; the issues open and closed looked in, once a run; no AI. A subject an issue holds is never opened again: open, it is left as it is; closed as not planned or as a duplicate, it is a person's no, left as it is; closed otherwise, it is said once on it that it was found again, and it stays closed.

func NewOpenings added in v0.10.0

func NewOpenings(f forge.Forge, max int) (*Openings, error)

NewOpenings prepares a run's openings on f, at most max findings opened.

func (*Openings) Open added in v0.10.0

func (o *Openings) Open(op Opening) (string, int, error)

Open opens the issue for op once, and says what became of it, with the issue holding it.

type Pending

type Pending struct {
	Issue int    `yaml:"issue"`
	Act   string `yaml:"act"`
	Line  string `yaml:"line"`
	Key   string `yaml:"key,omitempty"` // an issue to open: the text it would be opened from (ImportKey)
	// Capped: proposed only because the run's cap was reached, not left to
	// a person by its mode: its issue is read again at the next run.
	Capped bool `yaml:"capped,omitempty"`
	// Proposal is what the engine would do, as decided: done as it says
	// when a person of the project ticks its box (ADR-0025).
	Proposal *Proposal `yaml:"proposal,omitempty"`
}

Pending is an act proposed to a person, as the report says it.

func (Pending) Doable added in v0.12.0

func (q Pending) Doable() bool

Doable says whether the engine can do a proposal ticked: what it would do recorded, and not one only a person or the import does.

func (Pending) TickKey added in v0.12.0

func (q Pending) TickKey() string

TickKey is the pending proposal's key, as its line in the report carries it.

type Plan

type Plan struct {
	Decisions []Decision        `yaml:"decisions"`
	Findings  []verdict.Finding `yaml:"findings"`
	Record    Record            `yaml:"record"`
	Report    int               `yaml:"report"`  // the report issue, 0 when none is open yet
	Changed   bool              `yaml:"changed"` // the record changed: wrong closings found, proposals settled
	// contains filtered or unexported fields
}

Plan is what a run does with its acts, decided once, so a resumed run does the same.

func Decide

func Decide(f forge.Backlog, repo, role string, cfg Config, closes map[int]Proposal, read []int, judged map[int]Judged) (*Plan, error)

Decide plans the acts proposed, given at their place in the run, as far as the config lets the role go (ADR-0026). read lists the issues the run read: a proposal made only for a cap is dropped once its issue was read again, decided again or not. A run moves at most cfg.MovedPercent of the open issues (milestone and order). judged holds the second judge's answers on the issues announced obsolete (ADR-0024).

func (*Plan) Acts

func (p *Plan) Acts(i int) bool

Acts says whether the act at index i is done, not proposed nor dropped.

func (*Plan) Decision

func (p *Plan) Decision(i int) *Decision

Decision is what becomes of the act at index i, nil when it is none.

func (*Plan) ReportBody

func (p *Plan) ReportBody() string

ReportBody is the report issue's body: what the run did and proposes.

type Proposal

type Proposal struct {
	Do          string   `yaml:"do"` // close or sources: the intention's kind
	Issue       int      `yaml:"issue"`
	Reason      string   `yaml:"reason,omitempty"`
	DuplicateOf int      `yaml:"duplicate-of,omitempty"`
	Sources     []string `yaml:"sources,omitempty"`
	Milestone   string   `yaml:"milestone,omitempty"`
	Title       string   `yaml:"title,omitempty"` // an issue to open, or an issue's new title (rename)
	Into        []Child  `yaml:"into,omitempty"`  // the children of a split
	Quote       *Quote   `yaml:"quote"`
	Why         string   `yaml:"why"`
	// Refining: the sections written, Need and Validation as drafts; Added,
	// the engine's, says which the body did not have yet.
	Scope        string   `yaml:"scope,omitempty"`
	Verification string   `yaml:"verification,omitempty"`
	Need         string   `yaml:"need,omitempty"`
	Validation   string   `yaml:"validation,omitempty"`
	Added        []string `yaml:"added,omitempty"`
	Questions    string   `yaml:"questions,omitempty"` // asking the reporter; for an outsider's refine, what it still needs
	// The engine's, for the conversation with the reporter: the round this
	// comment would be, and whether a refine is proposed to the reporter in
	// a comment rather than written in the body (an outsider's issue).
	Round      int  `yaml:"round,omitempty"`
	ToReporter bool `yaml:"to-reporter,omitempty"`
	// Agreed, the engine's: who agreed in a reply to the text last proposed
	// to the reporter, which this refine writes; checked again on the forge
	// (Agreement), never taken from the agent.
	Agreed string `yaml:"agreed,omitempty"`
	Spent  bool   `yaml:"spent,omitempty"` // the rounds spent: proposed to a person
	// Ordering: the priority set (1 to 4); a milestone left because it is
	// released (From, the engine's); and, the engine's, the issue's
	// priority and milestone before the run, written in the report.
	Priority int    `yaml:"priority,omitempty"`
	From     string `yaml:"from,omitempty"`
	Before   string `yaml:"before,omitempty"`
	// Obsolete (ADR-0024): Announced, on the engine's closing, the day of
	// the announcement it follows; Announce and Until, the engine's, that
	// this act announces rather than closes, and the day from which it may
	// close; Judge, the engine's, the second judge's yes and its level;
	// Say, on a keep, that the issue is told why.
	Announced string `yaml:"announced,omitempty"`
	Announce  bool   `yaml:"announce,omitempty"`
	Until     string `yaml:"until,omitempty"`
	Judge     string `yaml:"judge,omitempty"`
	Say       bool   `yaml:"say,omitempty"`
	// Ticked, the engine's: who ticked this proposal's box in the report, a
	// person of the project — checked again on the forge, the act done as
	// the record says, never as the intention does (ADR-0025).
	Ticked string `yaml:"ticked,omitempty"`
}

Proposal is an act on an issue the agent proposed: a closing, or the code it is about named as its sources.

func LastProposal added in v0.11.0

func LastProposal(comments []string, role string) *Proposal

LastProposal reads the sections of the last refined text proposed to an issue's reporter; nil when none was, or it does not read.

func (Proposal) Kind

func (c Proposal) Kind() string

Kind is the kind of act, as settings name it.

type Quote

type Quote struct {
	Path  string `yaml:"path,omitempty"`
	Issue int    `yaml:"issue,omitempty"`
	Text  string `yaml:"text"`
}

Quote is the evidence an act cites: a text in a file, or in an issue.

type Record

type Record struct {
	Closed  []Closing `yaml:"closed,omitempty"`
	Wrong   []Closing `yaml:"wrong,omitempty"`        // closings found wrong: their issue open again
	Propose []string  `yaml:"propose,flow,omitempty"` // kinds of act back to propose, until the person says
	// Done are the role's own acts a person may undo, other than closings:
	// a rename, a priority, a milestone, ready, a split (ADR-0026); Undone,
	// those a person undid, with what shows it.
	Done     []Done    `yaml:"done,omitempty"`
	Undone   []Undo    `yaml:"undone,omitempty"`
	Proposed []Pending `yaml:"proposed,omitempty"` // acts proposed, kept until their issue is closed or proposed again
	// The person's hand (ADR-0025): the runs in a row whose report proposed
	// something and that nobody answered, and the comments of people of the
	// project on the report when last read.
	Ignored  int `yaml:"ignored,omitempty"`
	Comments int `yaml:"comments,omitempty"`
	// Measure is what people did with the proposals at the level in force,
	// for the report to suggest another (ADR-0026).
	Measure *Measure `yaml:"measure,omitempty"`
}

Record is what the role did, kept on its report issue.

type Setting

type Setting struct {
	Mode   string
	Max    int
	Rounds int      // asking: the times an issue's reporter is written to, then a person (ask only)
	Days   *int     // close-obsolete: the days an announcement waits; ObsoleteDays when nil
	Exempt []string // close-obsolete: labels that keep an issue from it; DefaultExempt when nil
	Drafts string   // refine: propose has Need and Validation drafts proposed, Scope and Verification written (ADR-0026)
}

Setting is a kind of act's mode and cap.

func (Setting) Delay added in v0.12.0

func (s Setting) Delay() int

Delay reads close-obsolete's delay; ObsoleteDays when it is not set.

type State

type State struct {
	Sources   []string `yaml:"sources"`
	Confirmed string   `yaml:"confirmed"`
	Judged    string   `yaml:"judged,omitempty"`   // the commit the role last read it at
	Comments  int      `yaml:"comments,omitempty"` // people's comments when it was last read
	Body      string   `yaml:"body,omitempty"`     // a digest of its body, when the role last read or wrote it
	Priority  int      `yaml:"priority,omitempty"` // the priority the role last set: another on the issue is a person's
	Title     string   `yaml:"title,omitempty"`    // the title the role last set: another on the issue is a person's
	Split     []int    `yaml:"split,omitempty"`    // the children the role split it into: it is not split again
	Kept      []string `yaml:"kept,omitempty"`     // the evidence an announcement as obsolete rested on, kept open: not announced again for it
}

State is what the engine knows of an issue, kept in one comment on it.

func ReadState

func ReadState(comments []string, role string) (*State, bool, error)

ReadState reads an issue's state from its comments.

type TickBy added in v0.12.0

type TickBy struct {
	Key string
	forge.Note
	Known bool // the forge says who ticked it: by name, or as a person of the project
}

TickBy is a box ticked in the report now, with who ticked it.

func (TickBy) Person added in v0.12.0

func (t TickBy) Person() bool

Person says whether the tick is a person of the project's: their yes.

func (TickBy) Who added in v0.12.0

func (t TickBy) Who() string

Who names who ticked, for the report and the issue told.

type Undo added in v0.13.0

type Undo struct {
	Issue    int    `yaml:"issue"`
	Act      string `yaml:"act"`
	Evidence string `yaml:"evidence"`
}

Undo is an act a person undid, and what shows it.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL